membrany)¢ $D601 COVOX2 sygna na ③cieəce 2¢ $D602 COVOX3 sygna na ③cieəce 3¢ $D603 COVOX4 sygna na ③cieəce 4¢¢ do tej pory jest tak samo jak w starym¢ COVOXie. A wyimaginowany ukad ma wpi-¢ sywa⇨ do tych rejestrw to, co trzeba,¢ korzystaj⇧c z kolejnych rejestrw:¢¢ $D604 C1IND uamkowa cz❎③⇨ adresu¢ w C1IADR ($D605)¢ $D605 C1ADR adres prbki - ③cieəka 1¢ (3 bajty, ale 20 bitw¢ chyba wystarczy, pod¢ $D605 - najmodszy bajt,¢ $D607 - najstarszy)¢ $D608 C1END adres koca prbki¢ $D60B C1REP adres pocz⇧tku p❎tli¢ $D60E C1FRQ cz❎stotliwo③⇨ na ③cieəce 1¢ $D610 C1VOL go③no③⇨ na ③cieəce 1¢ i dalej w tej samej kolejno③ci to¢ samo dla kolejnych ③cieəek. Na koniec¢ potrzebny jest jeszcze jeden rejestr,¢ nazwijmy go CVCTL, do kontroli ukadu,¢ ktrej temat rozwin❎ jeszcze nieco¢ p♪niej, a tymczasem wytumacz❎, co¢ znacz⇧ niezrozumiae skrty my③lowe¢ w powyəszej tabelce.¢ W dalszych opisach nazwy rejestrw¢ b❎d❎ zapisywa z x-em oznaczaj⇧cym¢ ③cieək❎, ktr⇧ rejestr ten obsuguje.¢ Np. CxVOL moəe oznacza⇨ C1VOL, C2VOL,¢ C3VOL jak i C4VOL, ale poniewaə nie ma¢ to wpywu na sam algorytm, wi❎c, əeby¢ go nie zaciemnia⇨, po prostu numerek¢ ukryem.¢ Co do rejestrw, to mam ma⇧ pro③b❎:¢ byoby niezmiernie mio, gdyby przy-¢ najmiej rejestry COVOXx i CxADR day¢ si❎ odczytywa⇨. Po co? Bo przy pisaniu¢ programu obsuguj⇧cego takie cudo,¢ moəna si❎ pokusi⇨ o bajerki. Pobiera-¢ j⇧c dane z COVOXx robi si❎ oscyloskop,¢ a z CxADR - wska♪nik aktualnie odgry-¢ wanej prbki.¢¢ A teraz "kilka" ;) sw o adresowa-¢ niu pami❎ci przez POVOXa. Jest to¢ z punktu widzenia kodera szczeglnie¢ waəna rzecz, əeby byo tak, a nie¢ inaczej (chyba, əe kto③ znajdzie¢ lepszy sposb), dlatego si❎ tak okrut-¢ nie rozpisaem. Jak na mj gust, to ta¢ metoda jest teə chyba najatwiejsza do¢ praktycznego zrealizowania.¢ Adres aktualnie odtwarzanego bajtu¢ sampla naleəy rozumie⇨ nast❎puj⇧co:¢¢ bajt3 bajt2 bajt 1¢ CxADR+2 CxADR+1 CxADR¢ ----------------------------¢ ....xxxx xxyyyyyy yyyyyyyy¢¢ Spacje s⇧ tylko po to, əeby rozdzie-¢ li⇨ pojedyncze bajty od siebie. Bity¢ ukryte pod igrekami tworz⇧ adres¢ odtwarzanego bajtu wzgl❎dem pocz⇧tku¢ adresu banku dodatkowej pami❎ci dla¢ CPU ($4000), a owe banki s⇧ numerowane¢ za pomoc⇧ bitw ukrytych pod x-ami.¢¢¢ Bitw tych w przykadzie jest sze③⇨,¢ co daje 64 banki (1 MB) dodatkowej¢ pami❎ci, ale ilo③⇨ wykorzystanych¢ bitw powinna by⇨ dobrana w zaleəno③ci¢ od ilo③ci pami❎ci w danym kompie.¢ Banki powinny by⇨ numerowane zgodnie¢ z bitami portu B, to znaczy: jeəeli¢ w porcie B znacz⇧ce s⇧ cztery bity¢ (+256kB), np. 6,5,3 i 2, to powinny¢ one odpowiada⇨ bitom CxADR w taki¢ sposb:¢¢ 7ÀŒ4øØ10 PORTB¢ ⁿⁿ ⁿⁿ¢ ......°° °°yyyyyy yyyyyyyy CxADR¢ bajt 3 bajt 2 bajt 1¢¢ Bity ukryte pod kropkami nie maj⇧¢ wpywu na prac❎ ukadu.¢ Jeəeli w kompie jest 1MB (64 banki,¢ czyli 6 bitw prze⇧czaj⇧cych Portu B,¢ zazwyczaj: 7,6,5,3,2 i 1), to przypo-¢ rz⇧dkowanie wygl⇧da tak:¢ ÃÀŒ4øØõ0 PORTB¢ ⁿⁿⁿ »ⁿⁿ¢ ....°°°° °°yyyyyy yyyyyyyy CxADR¢ bajt 3 bajt 2 bajt 1¢¢ Czyli wykorzystywane jest tylko tyle¢ bitw x, ile jest aktywnych bitw¢ prze⇧czaj⇧cych PORT B.¢ Na tej samej zasadzie podaje si❎¢ adresy w CxADR, CxREP i CxEND.¢¢ Proste, prawda?¢¢ Dlaczego tak namotaem przy tych¢ x-ach? Bo jeəeli omijamy PIA, to nie¢ podajemy juə numeru banku jak do¢ PORTu B przy normalnym adresowaniu¢ jak CPU, tylko traktujemy dodatkow⇧¢ pami❎⇨ jakby bya ci⇧gym, pojedynczym¢ buforem karty d♪wi❎kowej, gdzie¢ przechowywane s⇧ sample i adresujemy¢¢ ca⇧ przestrze tej pami❎ci od razu,¢ a nie bankami. Podzia jest zasadniczo¢ wyimaginowany i suəy tylko temu, əeby¢ koder w symbiozie z procesorem nie¢ pogubili si❎ przy adresowaniu. Dlatego¢ kolejno③⇨ bankw powinna by⇨ logicznie¢ powi⇧zana z kolejno③ci⇧ obszarw po¢ $4000 bajtw w pami❎ci POVOXa. Naj-¢ wa③ciwsze rozwi⇧zanie, to wa③nie¢ tablica, w ktrej numery bankw uoəo-¢ ne b❎d⇧ w kolejno③ci rosn⇧cej. Jeəeli¢ chcemy wiedzie⇨, do ktrego banku¢ musimy si❎ odwoa⇨, aby uzyska⇨ dost❎p¢ do okre③lonego adresu pami❎ci POVOXa,¢ bierzemy cz❎③⇨ tego adresu opisan⇧¢ x-ami i traktujemy j⇧ jako indeks¢ w tej tablicy. Wtedy procesor ZAWSZE¢ b❎dzie mg uzyska⇨ dost❎p do wa③ci-¢ wego miejsca w pami❎ci.¢ Czyli adres dla tego interface'u¢ moəe wygl⇧da⇨ np. tak: $02E1F5¢ (binarnie: %00101110000111110101), ale¢ CPU, əeby odpowiedni bajt zaadresowa⇨,¢ b❎dzie musia z tego adresu wydzieli⇨¢¢ numer banku (%001011), na jego pod-¢ stawie pobra⇨ z tablicy kod banku dla¢ PIA, pozosta⇧ cz❎③⇨ (%10000111110101)¢¢ doda⇨ do $4000 (bitowe OR), aby otrzy-¢ ma⇨ adres wewn⇧trz banku, czyli¢ %0110000111110101 - po ludzku $61F5.¢¢ Przy takim adresowaniu nie trzeba¢ si❎ bawi⇨ w prze⇧czanie bankw,¢ prbki mog⇧ mie⇨ wi❎c dowoln⇧ dugo③⇨,¢ ograniczon⇧ tylko ilo③ci⇧ dodatkowej¢ pami❎ci. POVOX adresuje ca⇧ pami❎⇨¢ nie zwracaj⇧c uwagi na podzia na¢ banki, CPU dalej korzysta z niej przez¢ PORT B i obszar $4000-$7FFF, wi❎c¢ w zasadzie wszystko dziaa tak, jak¢ do tej pory.¢¢ Po takim opatologicznym opisie¢ wszystko powinno by⇨ jasne. Jeəeli nie¢ jest - id♪ na piwo, wytrze♪wiej, id♪¢ na piwo, wy③pij si❎, wytrze♪wiej,¢ wypij dwie szklanki wody mineralnej¢ niegazowanej, zjedz co③ syc⇧cego,¢¢ odprowad♪ z organizmu niepotrzebne¢ substancje i w peni skupiony i wypo-¢¢ cz❎ty zacznij czytanie od linii numer¢ jeden. Jeəeli dalej nie rozumiesz, to¢ wr⇨ si❎ do podstawwki. Po kilku¢ (-nastu) latach moəe zrozumiesz. ;>¢¢ A Ci, ktrzy zrozumieli, mog⇧ z dum⇧¢ i rozkosz⇧ rozpocz⇧⇨ dalsze czytanie.¢¢ Poniewaə POVOX ma zast❎powa⇨ ca⇧¢ procedurk❎ odtwarzania sampli, ⇧cznie¢ z ich zap❎tlaniem, wi❎c po doj③ciu do¢ adresu okre③lonego w CxEND, powinien¢ wstawia⇨ adres pocz⇧tku p❎tli CxREP do¢ CxADR.¢¢ Jak wiadomo, aby odtwarza⇨ sample¢ z rən⇧ cz❎stotliwo③ci⇧, naleəy po¢ przepisaniu odpowiedniej danej do¢ rejestru COVOXa, naleəy zwi❎kszy⇨¢ adres o pewn⇧ sta⇧ warto③⇨, od ktrej¢ zaleəy wysoko③⇨ d♪wi❎ku. Warto③⇨ ta¢ bardzo cz❎sto ma "co③" po przecinku,¢ st⇧d rejestr CxIND okre③laj⇧cy uamko-¢ w⇧ cz❎③⇨ adresu, ktrej warto③⇨ nie¢¢¢ ma wpywu na to, sk⇧d pobierane s⇧¢ dane. Rejestr CxFRQ rwnieə zawiera¢ liczb❎ w takim zakamuflowanym zmienno-¢ (a wa③ciwie stao- bo przecinek stoi¢ zawsze mi❎dzy sidmym a smym bitem)¢ przecinkowym formacie, gdzie modszy¢ bajt oznacza cz❎③⇨ uamkow⇧, dodawan⇧¢ do CxIND w kaədym przebiegu, a starszy¢ jest dodawany do najmodszego bajtu¢ CxADR. Proste, prawda?¢ Symbolicznie moəna zapisa⇨ dziaania¢ przy dodawaniu adresw w nast❎puj⇧cy¢ sposb:¢ x3x2x1.y1¢ + z2.z1¢ ----------------¢ a3a2a1.c1¢¢ x3x2x1 to zawarto③⇨ rejestru CxADR,¢ gdzie x3 to bajt najstarszy, a x1 -¢ najmodszy. y1 to CxIND, czyli uamek¢ w adresie, z1 to modszy bajt CxFRQ,¢ z2 to bajt starszy.¢¢¢ Teraz chyba jest to zrozumiae. Wyni-¢ kiem jest liczba a3a2a1, wpisywana do¢ CxADR (a3 bajtem najstarszym,¢ a1 - najmodszym)¢ zawieraj⇧ca cz❎③⇨ uamkow⇧ c1 wpisywa-¢ n⇧ do CxIND. Czyli innymi sowy ukad¢ dodaje fizycznie liczb❎ dwubajtow⇧ do¢ czterobajtowej, ale najmodszy bajt¢ adresu to cz❎③⇨ uamkowa, bo wa③ciwy¢ adres znajduje si❎ w starszych 3 baj-¢ tach, zawieraj⇧cych cz❎③⇨ cakowit⇧¢ Tak wi❎c dla uproszczenia budowy uka-¢ du CxIND powinien znajdowa⇨ si❎ tuə¢ przed CxADR, stanowi⇧c z nim jedn⇧¢ cao③⇨ 32-bitowego adresu.¢¢ Bardziej opatologicznie juə nie¢ potrafi❎. Jeəeli masz problemy z tymi¢ uamkami, to zajrzyj do Seriousa o ile¢ dobrze pami❎tam numer #10, gdzie¢ Krger w artku pt. "Siedemnastobitowa¢ arytmetyka" bardzo rzeczowo opisa ten¢ temat.¢¢ Przykadowo odtwarzanie sampla tak,¢ jak jest zapisany w pami❎ci, czyli¢ bajt po bajcie, musi rozpocz⇧⇨ si❎¢ wpisaniem 0 do CxIND, adresu pocz⇧tku¢ sampla do CxADR, adresu koca sampla¢ do CxEND, adresu pocz⇧tku p❎tli do¢ CxREP, i w kocu $0100 do CxFRQ.¢¢¢ Dlaczego aqrat tyle? Bo wtedy uamkowa¢ cz❎③⇨ adresu nie jest w ogle ruszana¢ (dodawanie zera), w kaədym cyklu¢ POVOXa do cakowitej cz❎③ci adresu do-¢ dawane jest 1 (starszy bajt CxFRQ),¢ wi❎c prbki s⇧ puszczane po kolei.¢¢¢ Odtwarzanie sampla oktaw❎ niəej¢ realizuje si❎ przez wpisanie $0080 do¢ CxFRQ, a oktaw❎ wyəej - CxFRQ=$0200.¢¢ Jasne?¢¢ I wszystko byoby pi❎knie, gdyby nie..¢ moja dzika fanaberia ze zmian⇧ go③-¢ no③ci. Domy③lam si❎, əe o ile dodawa-¢ nie moəna zrealizowa⇨ w do③⇨ prosty,¢ dziaaj⇧cy szybko sposb, o tyle uka-¢ d wykonuj⇧cy odpowiednie dzielenia w¢ wystarczaj⇧co krtkim czasie byby¢ chyba zbyt skomplikowany, a nawet je③-¢ li nie, to pewnie zbyt drogi.¢ A w ogle - po co robi⇨ ukad o moəli-¢ wo③ciach arytmetycznych przewyəszaj⇧-¢ cych CPU, tylko do puszczania sampli?¢ No? Dlatego maj⇧c typowo koderski na-¢ wyk tablicowania wszystkiego, co si❎¢ da, proponuj❎ dooəenie EPROMki zawie-¢ raj⇧cej tablice go③no③ci.¢ Jeəeli ustali⇨ 32 poziomy go③no③ci¢ oraz poziom "0" - cisz❎ (jak w Neo),¢ to tablice zajmowayby rwno 8kB, przy¢ czym w tablicach pomijamy ow⇧ cisz❎,¢ bo ukad moəe atwo wykry⇨, əe jest¢ wpisana go③no③⇨ 0 i po prostu bez¢ əadnej zabawy wpisa⇨ 128 do wa③ciwego¢ rejestru COVOXa, ewentualnie rozpozna⇨¢ maksymaln⇧ go③no③⇨ i po prostu prze-¢ pisa⇨ sampla, z pomini❎ciem tablicy.¢¢¢ No i fajnie by byo, gdyby te tablice¢ byy numerowane tak jak w Neo- i Pro-¢ Trackerze, czyli parzystymi numerkami¢ z zakresu 0-64.¢¢ My③l❎, əe jest to jasne. No a je③li¢ nie... to wiesz, co masz robi⇨! ;>¢¢ To tyle opisu szczegowego, a teraz¢ rozpiska algorytmu, ktry miaby¢ realizowa⇨ opisywany interface¢ w kaədym swoim cyklu. Jest taki j❎zyk,¢ ktry nazywa si❎ BASIC. Moim zdaniem¢ jego najlepszym zastosowaniem jest¢ przedstawianie algorytmw w formie¢ krtkiej, zwi❎zej i zrozumiaej.¢ Wi❎c... jak nie znasz BASICa, to...¢ nie wracaj si❎ do podstawwki, tylko¢ czytaj Zientar❎! hehe... ;>¢ Jest mae ale... Otə tym razem¢ zastosuj❎ nieco zmodyfikowany TBXL, bo¢ mamy co③ takiego jak sowa 3-bajtowe¢¢¢ (24 bity), wi❎c odpowiednie dla nich¢ POKE i PEEK to TPOKE i TPEEK, analo-¢ gicznie jak dla 2-bajtowych s⇧ DPOKE¢ i DPEEK. A əe s⇧ teə sowa 4-bajtowe¢ (PEEK(CxIND)+TPEEK(CxADR)*256), to dla¢ uproszczenia zastosujemy do nich inst-¢ rukcj❎ QPOKE i funkcj❎ QPEEK. Jak¢ przebiega adresacja, to juə wiemy.¢¢ . pobranie danych z pami❎ci¢ 10 CPUHALT=1¢ 15 A=PEEK(TPEEK(C°ADR))¢ 20 CPUHALT=0¢¢ . wpisanie do COVOXa¢ 25 IF PEEK(C°VOL)=$40¢ 30 POKE COVOX°,A¢ 35 ELSE¢ 40 POKE COVOX°,VTAB(PEEK(C°VOL) DIV¢ 2,A)¢ ewentualnie:¢ 40 POKE COVOX°,EPEEK(PEEK(C°VOL) DIV¢ 2*128+A)¢ 45 ENDIF¢¢ . aktualizacja adresw¢ 50 QPOKE C°IND,QPEEK(C°IND)+DPEEK(C°FR¢ Q)¢ 55 IF TPEEK(C°ADR)>=TPEEK(C°END) THEN¢ TPOKE C°ADR,TPEEK(C°REP)¢¢ Takie "co③" kopiujemy cztery razy,¢ za "°" podstawiaj⇧c kolejno 1,2,3 i 4.¢ No i par❎ sw komentarza:¢ Do pierwszej cz❎③ci - umwmy si❎, əe¢ stan zmiennej CPUHALT odzwierciedla¢ stan blokady kompa. 1 oznacza, əe¢ praca 6502 jest wstrzymana. Oczywi③cie¢ ANTICa teə. O ile mi wiadomo, 6502 ma¢ moəliwo③⇨ zablokowania przez podanie¢ odpowiedniego sygnau na pin HALT (ty-¢ lko w ATARI), ale z ANTICiem b❎dziecie¢ si❎ chyba musieli troch❎ pom❎czy⇨.¢ Do cz❎③ci drugiej - sprawdzamy, czy¢ go③no③⇨ jest maksymalna, w praktyce¢ wystarczy sprawdzi⇨ stan bitu 6 (li-¢ cz⇧c od 0) - jeəeli jest ustawiony,¢ to go③no③⇨ jest maksymalna, wi❎c¢ przepisujemy prbk❎ prosto do COVOXa.¢¢¢ W przeciwnym razie pobieramy warto③⇨¢ z tablicy w EPROMce, gdzie modszy¢ bajt adresu w EPROM to bajt pobrany¢ z pami❎ci, a starszy skada si❎¢ z bitw 5-1 CxVOL. Funkcja EPEEK odpo-¢ wiada wa③nie za pobranie bajtu¢ z tablicy w EPROM.¢¢ Cz❎③⇨ trzecia jest chyba zrozumiaa.¢ "Dodawaczk❎" (element ALU) na upartego¢ moəna zoəy⇨ nawet z "paru" ;) bramek¢ logicznych.¢¢ Aha. No i jeszcze rejestr CVCTL.¢ Pierwsze, co przychodzi logicznie¢ my③l⇧cemu czowiekowi do gowy, je③li¢ chodzi o kontrol❎ ukadu, to (co jest¢ chyba jasne) jego w⇧czanie i wy⇧cza-¢ nie. Do tego wystarczy jeden dowolny¢ bit tego rejestru. Jeəeli ma wasny¢ zegar, o cz❎stotliwo③ci powiedzmy¢ 31kHz, bo taka jest potrzebna, je③li¢¢¢ odtwarzamy co p linii (dla zaokr⇧-¢ glenia moəna przyj⇧⇨ 32kHz), to kaədy¢ impuls takiego zegara powoduje¢ wykonanie algorytmu, nad ktrego¢ opisaniem tyle si❎ juə napociem, əe¢ mam juə do③⇨... Ale kto③ moəe zechcie⇨¢ wrci⇨ do 15.5 kHz, czyli co 1 lini❎,¢ i przydaaby si❎ moəliwo③⇨ ustawienia¢ takiego trybu, əe odtwarzania prbki¢ powodowaby tylko co drugi impuls.¢ Fanatycy, ktrzy zrealizuj⇧ ultra-¢ szybki ukad mog⇧ wsadzi⇨ zegar 62kHz,¢ a wtedy to nawet grzybiarzom gay¢ wyjd⇧ na wierzch, byleby bya moəli-¢ wo③⇨ redukcji do 31 i 15.5 kHz, ewen-¢ tualnie 20.67kHz (62/3). I to byby¢ jedyny przypadek, gdzie przydaby si❎¢ prosty dzielnik cz❎stotliwo③ci.¢¢ Natomiast jeəeli nie masz ochoty na¢ zabaw❎ z zegarkami i dzielnikami¢ cz❎stotliwo③ci, to mam ciekaw⇧¢ alternatyw❎: jakikolwiek wpis do¢ CVCTL powoduje wykonanie "procedurki".¢¢ I to juə wa③ciwie wszystko.¢¢ Hmm... domy③lam si❎, əe praktyczna¢ realizacja powyəszych postulatw moəe¢ by⇨ trudna, a cay ten "POVOX" moəe¢ mie⇨ rozmiary i cen❎ wi❎ksz⇧ od samego¢ kompa... Ale... To wszystko tylko¢ wymysy mojej wybujaej wyobra♪ni,¢ sprowokowanej przez przygody przy¢ pisaniu procedury odtwarzaj⇧cej sample¢ na COVOXie. W wi❎kszo③ci komputerw¢ ukady odpowiedzialne za generowanie¢ grafiki czy d♪wi❎ku odci⇧əaj⇧ w duəym¢ stopniu procesor w tych dziaaniach,¢ wi❎c dlaczego Atarka miaaby pozosta⇨¢ w tyle?¢¢ Tak w ogle, to zastanawiam si❎, czy¢ moəe to mie⇨ jaki③ sens, skoro Pasiu¢ ci⇧gle udoskonala swoj⇧ "Sodk⇧¢ szesnastk❎" i moəe zamiast pisa⇨ wer-¢ sje dla "POVOXa", zrobibym te same¢ dla 65c816 z zegarem powiedzmy 16MHz,¢ oczywi③cie w trybie natywnym... Co...?¢¢¢ Tylko czy Turbo-816 b❎dzie na tyle¢ dost❎pne? Tak czy inaczej nie zapomn❎¢ nigdy o posiadaczach "starego" COVOXa¢ (jak to adnie brzmi...) i ci⇧gle b❎d⇧¢ mieli nowe moəliwo③ci NeoTracker-a,¢ ale przy cz❎stotliwo③ci 11.7 kHz... :(¢¢ Powodzenia i... miej zabawy :) przy¢ pracy ;> nad "POVOXem" əyczy¢ epi/Allegresse¢¢ pe|es: wiem, əe juə chc❎ o wiele za¢ duəo, ale nie bijcie, dobra? ...¢ Moəe by tak jeszcze POVOX dziaa¢ w drug⇧ stron❎, to znaczy zamiast¢ przepisywa⇨ dane z pami❎ci na wyj③-¢ cie audio, przepisywaby je z wej③-¢ cia (przez przetworniki A/D) do¢ pami❎ci? To by byo cudo. :)¢ ...¢ A! Au! AAAAAAAA! Prosiem, əeby nie¢ bi⇨! Aaauuuu!!! Dooobra... spadam!¢