Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web development, networking and server security. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Problemi sa $D000-$DFFF muzičkim kodovima/podacima




Posle čitanja uputstva koje je Ričard Bejlis postavio na “Playing music at $A000 - $FFFF “behind” "jezgra", mislio sam da zabeležim neke važne tačke:

Problem 1



Može da se desi da uključite muzički fajl koji se startuje sa bilo koje adrese PRE $D000, i da dovede do iscrpljenosti memorije između $D000-$DFFF. Na primer, ton skladišten između $A000-$E757... recimo da je kolekcija pod-tonova ili ton sa podacima o semplovima.

Kada se sastavlja izvorni kod, videćete da program nikako ne uspeva da pusti muziku (ili još gore, ne radi uopšte!) Zašto je to tako?

Sasvim jednostavno, zato što $D000-$DFFF je banka matičnih registara rezervisana za I/O registre(SID registri, VIC registri, CIA registri i registri za proširivanje hardvera... Na primer, dva SID čipa).

Rešenje



Postavljanje $01 na #$35 ne daje vam pristup $D000-$DFFF RAM jer je još skriveno ispod. Da biste pristupili RAM memoriji, morate postaviti $01 na #$30 (* ili bilo koju vrednost, gde su prva 4 najmanje značajna bita, nula ). Ovaj uslov zatvara sve ROM banke i daje pun pristup 64k RAM-u.

Problem 2



Ovo, međutim, dovodi do drugog problema. Većina rutina za muziku direktno piše u SID kada se pozove "play" potprogram. Dakle, kada se postavi $01 na #$30 * i pozove se "play" (npr. JSR $1003), videćete da SID registar ne uspeva da piše na I/O registar i da računar ostaje "nem". To je jednostavno zato što se podaci SID registra ne pišu na I/O registre između $D400-$D418, umesto toga pišu na RAM memoriju. Ovo dovodi do drugog problema, ako je muzika uskladištena između $D400-$D419. Neću ulaziti u detalje, ali vas uveravam da će vam sinhronizacija muzike/zvuk biti upropašćeni.

Rešenje 2



Srećom, neki dobri programeri smislili su način da zaobiđu ovo. Ovo se zove "duh-registri". Duh-registri funkcionišu na isti način kao dvostruki bafer(amortizer). Sve što treba da uradite je da zamenite, "STA $D400", na primer sa "STA $4000"... Drugim rečima, SID podaci se čuvaju u registru $4000 - $4018, više nego $D400-$D418. Kada završite pozivanje PLAY potprograma, namestite $01 do nazad na #$35/$37, a zatim pročitajte podatke iz duh-registra, i prenesite vrednost u SID registre kao u nastavku:
lda #$30 ; Isključite I/O and ROM sta $01 jsr $d003 ; Uključite muziku uskladištenu na $d000-$e000 lda #$37 ; Uključite I/O sta $01 ldx #$18 ; Transfer podataka sa duh-registra na SID-registre - lda $4000,x sta $d400,x dex bpl -
Koliko ja znam, najnoviji muzički editori, kao što su SDI i Goat-Tracker, ima opciju da podesite "duh-registre", što štedi vreme i trud da se prođe kroz sve muzičke kodove i zamenite adresu SID registra, adresom duh-registra. Naravno, duh-registri su nova stvar, zato stariji tonovi zahtevaju da idete kroz ovu bolnu praksu u svakom slučaju.

Zaključak



Ovo je, zapravo, vrlo loša ideja da se uspostavi ton koji ima podatke uskladištene u I/O adrese banke. Ako zaista morate imati ton uskladišten u okviru $A000-$FFFF za Vašu proizvodnju/demo, molimo proverite da li se vaš kod i/ili podaci ne čuvaju u I/O banci tako da ne morate da prolazite kroz probleme i rešenja koje smo gore objasnili.

Hvala na čitanju. Konrad/Viruz (14. april 2012)




Published (Last edited): 04-09-2012 , source: http://codebase64.org/doku.php?id=base:avoiding_the_d000-_dfff_issue_for_playing_music