¢ NeoTracker - co i jak?¢¢ Praca konkursowa¢ ____________________¢ By sobie magazyn dyskowy. Nazywa¢ si❎ Serious Magazine. Gdzie③ w numerze¢ jedenastym, Wielce Szanowna Redakcja¢ tegoə Magazynu ogosia konkurs...¢ Temat dowolny, forma dowolna, ma by⇨¢ o Atari i... najlepsze z najlepszych.¢¢ (to nie redakcja ogosia konkurs,¢ tylko ja, Zenon/DIAL, a Jager macza¢ w tym swoje palce)¢¢ W czym wi❎c problem? Hehe... hmmm...¢ ee... no... tego... nie miaem əadnego¢ pomysu :( ... A Redaktor Naczelny,¢ dobry przyjaciel nas wszystkich, a mj¢ szczeglnie, napisa do mnie: "No¢ a konkurs w Seriousie? chyba tego nie¢ odpu③cisz?". Nie mogem wi❎c zawie③⇨¢ przyjaciela. Cae wakacje my③laem, co¢ by tu przygotowa⇨. Moəe jaki③ moduek,¢¢ ale z drugiej strony... mam tylko¢ jeden, niezbyt dobry, no i ma pj③⇨ na¢ msx-compo na party... A po party by¢ juə kompletny d, bo wena mnie kom-¢ pletnie opu③cia. Ale, ale...¢¢ Z nieco innej beczki. Par❎ razy¢ rozmawiali③my z Pinokiem o tym, jaka¢ ta Inertia i jaki ten ProTracker jest¢ be i w ogle. A bo co③tam mu duəsze¢ moduki si❎ sypi⇧. A bo nie obsuguje¢ podkatalogw i w dodatku tylko kilka¢ moduw na jednym dysku. A on ma HDD,¢ wi❎c go to boli. I ja go rozumiem...¢ A chciaem co③ takiego napisa⇨. Ale¢ by jeden problem: sk⇧d taki nieuk jak¢ ja moəe wiedzie⇨, jak odtwarza⇨ sample¢ z rən⇧ cz❎stotliwo③ci⇧? Aə wstyd si❎¢ przyzna⇨, jakie absurdalne pomysy¢ przychodziy mi do gowy, zanim...¢ nadszed TEN dzie: 12.08.07d2...¢ W nocy z soboty na niedziel❎ nie¢ mogem zasn⇧⇨ i mniej wi❎cej o wp do¢ trzeciej, po dwch godzinach przewra-¢¢ cania si❎ z boku na bok... Wpadem na¢ tak prost⇧ rzecz, əe teraz wstyd si❎¢ przyzna⇨, əe kocz⇧c 16 lat o niej nie¢ wiedziaem. O sssooo choozzziii? ;)¢ Przypomnia mi si❎ wtedy artyku¢ Krgera "Siedemnastobitowa arytmetyka"¢ a dokadniej... uamki binarne. Boəe¢ na wysokim niebie, czemu ja na to¢ wcze③niej nie wpadem?! Przecieə əeby¢ odtwarza⇨ sample z rən⇧ cz❎stotliwo③-¢ ci⇧, wystarczy zwi❎ksza⇨ adres aktual-¢ nie odtwarzanej prbki nie co 1, tylko¢ o mniejsze lub wi❎ksze warto③ci, cz❎s-¢ to niecakowite, a wa③ciwa cz❎stotli-¢ wo③⇨ odtwarzania pozostaje staa!¢ No... dobra, to wiedziaem juə nieco¢ wcze③niej, aə taki gupi nie jestem.¢ Tylko əe we bie mi si❎ nie mie③cio,¢ jak moəna dodawa⇨ uamki z tak⇧ szyb-¢ ko③ci⇧, əeby cz❎stotliwo③⇨ odtwarzania¢ nie powodowaa odruchu zwanego przez¢ X-Ray'a (gtx!) "zamykaniem uszu". Jak¢ by to uj❎y osoby pokroju koleəanek¢ mojej siostry: "Obciach po maksie!"¢¢¢ Kiedy tylko si❎ obudziem, zacz⇧em¢ robi⇨ tablice cz❎stotliwo③ci, pchek❎¢ w QA, əeby potwierdzi⇨ oczywist⇧ hipo-¢ tez❎ i kiedy udao mi si❎ odpali⇨¢ melodyjk❎ na samplu w 15kHz, to ci③-¢ nienie tak mi podskoczyo, əe pisaem¢ na penych obrotach przez dwa tygodnie¢ aə wreszcie skoczyem. Jednak zanim¢ skoczyem, miaem troch❎ przygd. Od¢ pocz⇧tku:¢¢ Nast❎pnego dnia miaem juə kilka¢ procek, ekran i przede wszystkim¢ nazw❎: NEOTRACKER. Poniewaə poet⇧ nie¢ jestem, wi❎c na nic lepszego nie byo¢ mnie sta⇨. Zmys estetyczny teə mam¢ w⇧ty (ale mam! ;)) i dlatego program¢ wygl⇧da, tak jak wygl⇧da. Spieszyo¢ mi si❎, bo w tzw. "mi❎dzyczasie"¢ wpadem na kolejny genialny pomys...¢ Oto jest moja praca na konkurs naj-¢ poczytniejszego maga na Atari! Ale¢ wtedy dostaem "spida"... ;)¢¢ Dnia 15.08.07d2, czyli, jak to si❎¢ mwi, w ③rod❎ wieczorem, nast⇧pio¢ pierwsze odpalenie moduku w NeoTrac-¢ kerze. MASAKRA - cz❎stotliwo③⇨ co¢ pi❎⇨ linii... 3.1kHz. Gratulacje. Ale¢ si❎ nie poddaem. Cay tydzie ci❎əko¢ pracowaem, aby przyspieszy⇨ j⇧ przy-¢ najmniej do 11kHz, bo kiedy postawiem¢ pierwsze LDA w kodzie Neo, zawzi⇧em¢ si❎, əe b❎dzie to cacuszko, wi❎c¢ jakbym nie przebi cz❎stotliwo③ci¢ odtwarzania z Inertii, to chyba bym¢ si❎ powiesi. Tyle roboty i taka¢ plama? Po kolei wi❎c wywalam wszystkie¢ ③mieci: adresowanie po③rednie, jakie③¢ liczniki, w kocu cao③⇨ l⇧duje na¢ stronie zerowej, kontrol❎ naci③ni❎cia¢ spacji dodaem do przerwania taktu-¢ j⇧cego (czyli do czego③, co w "normal-¢ nych" atarowskich tracker-ach nazywa¢ si❎ "player-em co ramk❎"), duəa cz❎③⇨¢ danych jest pobierana w trybie natych-¢ miastowym (niech əyje assembler¢ i automodyfikacja!) ...¢¢ Kiedy doszedem do 10.95kHz, ci⇧gle¢ byem pewien, əe moəna wi❎cej. Ale¢ nie miaem pomysw. Odpaliem Inerti❎¢ wcisn⇧em SELECT+RESET, potem RETURN.¢ szukam playerka sampli w kodzie. Jest.¢ Be. Co zobaczyem? Dokadnie to samo,¢ co u mnie, tylko gorzej, bo w Neo tak-¢ towanie juə byo na przerwaniu, a IP¢ po prostu odlicza do $D8, po czym¢ wywouje "ramk❎". Strata czasu. Profi¢ wida⇨ da si❎ zwie③⇨ nie do koca¢ prawdziwej teorii, əe od⇧czenie¢ przerwa przyspiesza dziaanie prog-¢ ramu. Umiej❎tne wykorzystanie przer-¢ wania pozwala zaoszcz❎dzi⇨ sporo czasu¢ na odliczaniu. Wystarczy podmieni⇨¢ zawarto③⇨ wektora NMIVEC...¢ W niedziel❎ wieczorem przyszo¢ kolejne ol③nienie. Zaraz! Po co mam¢ porwnywa⇨ adres prbki z adresem¢ koca sampla, skoro wystarczy go tak¢ umie③ci⇨, aby ostatni bajt by pod¢ $7FFF, a przekroczenie przez starszy¢ bajt adresu warto③ci $7F spowoduje¢¢ ustawienie bitu N rejestru znacznikw.¢ A wi❎c... jedno BPL i kopot z gowy!¢ Bogosawiony niech b❎dzie ten, kto¢ ustawi pami❎⇨ dodatkow⇧ w obszarze¢ $4000-$7FFF! Chociaə... Gdyby bya¢ w $8000-$BFFF, to moəna by zastosowa⇨¢ podobny trik. Jak? Zgadnijcie sami! :)¢ Ostatecznie na pocz⇧tku nast❎pnego¢ tygodnia procedura odtwarzaj⇧ca bya¢ juə kompletna, a wygl⇧daa tak:¢ (listing dla X-Assemblera 2.5)¢¢ opt h-¢ org $00 ;cykli suma¢¢ songpsl lda #0 2 2¢ t1bnk equ *-1¢ sta ^31 4 6¢ lda #0 2 8¢ t1ind equ *-1¢ adc #0 2 10¢ t1frq_l equ *-1¢ sta z:t1ind 3 13¢ lda z:t1iadr 3 16¢ adc #0 2 18¢ t1frq_h equ *-1¢ sta z:t1iadr 3 21¢ bcc play1 3/4 24/25¢ inc z:t1iadr+1 5 29¢ bpl play1 3/4 32/33¢ lda #0 2 34¢ t1rep_l equ *-1¢ sta z:t1iadr 3 37¢ lda #0 2 39¢ t1rep_h equ *-1¢ sta z:t1iadr+1 3 42¢ jmp spslt2 3 œŒ¢ play1 ldx $4000 4 29/37¢ t1iadr equ *-2¢ lda $d800,x 4 33/41¢ t1vol_ equ *-1¢ sta $d600 4 øÃ/œŒ¢ t1pflg equ *-1¢¢ I jeszcze trzy razy dla kolejnych¢ trzech kanaw (kaədy zaczyna si❎¢ od etykiety spslt°, gdzie ° to numer¢ kanau) to samo, oraz na samym kocu¢ jmp songpsl zajmuj⇧ce 3 cykle.¢ Algorytm, z ktrego wynika tre③⇨ tej¢ p❎telki jest opisany w innym artku,¢ tutaj ogranicz❎ si❎ do opisu samej¢ procki.¢¢ Kolejne etykiety oznaczaj⇧:¢¢ songpsl - pocz⇧tek p❎tli odtwarzaj⇧cej¢ sample w oknie song (dla paternw¢ i pojedynczych sampli s⇧ osobne¢ procki)¢ t1bnk - kod banku na danej ③cieəce¢ t1ind - uamkowa cz❎③⇨ adresu¢ t1frq_l/h - okres d♪wi❎ku wzgl❎dem¢ cz❎stotliwo③ci bazowej¢ t1rep_l/h - adres pocz⇧tku p❎tli¢ spslt2 - pocz⇧tek fragmentu obsugu-¢ j⇧cego kolejn⇧ ③cieək❎¢ play1 - tu zaczyna si❎ wa③ciwa¢ "odtwarzarka" ;)¢ t1iadr - adres prbki¢ t1ivol_ - adres tablicy go③no③ci¢ (od $D800 zaczyna si❎ tablica dla¢ vol=$00 i tak co stron❎ aə do $F000,¢ gdzie jest tablica dla vol=$40)¢¢ t1pflg - jeəeli ③cieəka jest wy⇧czo-¢ na, to tutaj zamiast $d6 program¢ wpisuje $FF, əeby na tej ③cieəce nic¢ nie grao, a jednocze③nie əeby nie¢ traci⇨ czasu na sprawdzanie innych¢ zmiennych (ma gra⇨, czy nie?)¢¢ W ostatniej kolumnie z prawej strony¢ cykle s⇧ sumowane, ostateczne warto③ci¢ po zakoczeniu dziaania tej cz❎③ci¢ p❎tli s⇧ odpowiednio wyrənione. Wida⇨¢ wi❎c, əe pojedynczy kana jest obsu-¢ giwany w czasie øà lub œŒ cykli, przy¢ czym ta druga warto③⇨ wyst❎puje¢ ③rednio raz na jakie③ 190 wywoa.¢ Zaleəy to od wysoko③ci sampli na¢ poszczeglnych kanaach i od pozycji¢ pocz⇧tku p❎tli. Liczby te s⇧ wyra♪nie¢ mniejsze niə w Inertii, mniejsza jest¢ teə rənica mi❎dzy nimi, dzi❎ki czemu¢ cz❎stotliwo③⇨ odtwarzania jest wi❎ksza¢ i bardziej stabilna. A ile wynosi?¢ W sumie procedura zajmuje 4*37+3=õŒõ¢ cykli. Raz na owo statystyczne 190¢¢¢ moəe mie⇨ 4*45+3=õÕø cykle. Zegar¢ procesora ma w ci⇧gu sekundy õÃÃÕœã㢠cykle, tak wi❎c cz❎stotliwo③⇨ powta-¢ rzania si❎ naszej p❎tli to okoo...¢¢¢ 190*1778400/(189*151+183) Hz¢¢¢ (mam nadziej❎, əe sposb wyprowadzenia¢ wzoru jest dla wszystkich jasny)¢¢ czyli... uwaga, uwaga...¢¢ õõÃÀœáז·¢¢ A wi❎c moəemy przyj⇧⇨, əe jest to¢ 11.7 kHz. W tym momencie mnie zatkao,¢ bo na potrzeby tego opisu przeliczaem¢ cykle i cz❎stotliwo③⇨ jeszcze raz¢ i okazao si❎, əe wcze③niej popeniem¢ b⇧d, uznaj⇧c, əe cz❎stotliwo③⇨ wynosi¢ 11.3 kHz. Szok. Ale bardzo miy :)¢¢¢ To tyle odno③nie samego odtwarzania¢ sampli. Pozostae "sztuczki", ktrych¢ opis wedle regulaminu jest "wskazany",¢ nie s⇧ juə tak spektakularne.¢ Procedura play_song odpowiedzialna¢ za odtwarzanie muzyki przenosi p❎tl❎¢ odtwarzaj⇧c⇧ na stron❎ zerow⇧, od⇧cza¢ ROM i przerwania, inicjuje zmienne,¢ ustawia wektor przerwa NMI na adres¢ pocz⇧tku playera i w⇧cza przerwanie¢ VBLANK.¢ Player jest wywoywany na przerwaniu¢ VBLANK, bezpo③rednio z wektora NMIVEC.¢ Na samym pocz⇧tku procka zapami❎tuje¢ zawarto③⇨ akumulatora. Nast❎pnie¢ sprawdza, czy wci③ni❎to spacj❎, co¢ oznacza əe naleəy przerwa⇨ odgrywanie.¢ Nast❎puje wtedy przej③cie do procedury¢ kocz⇧cej odgrywanie - zdejmuje ona ze¢ stosu warto③⇨ akumulatora oraz 3 bajty¢ dla RTI, przywraca poprzedni⇧ zawar-¢ to③⇨ strony zerowej, w⇧cza ROM¢ i przerwania oraz resetuje klawiatur❎.¢¢ Jeəeli spacja nie zostaa wci③ni❎ta,¢ to w dalszej cz❎③ci zmniejszany jest¢ licznik kontroluj⇧cy tempo odtwarzania¢ muzyki, jeəeli osi⇧gnie zero, to jest¢ on ustawiany na aktualn⇧ warto③⇨ tempa¢ i rozpoczyna si❎ dekodowanie paternw,¢ ktre nie jest jako③ szczeglnie¢ interesuj⇧ce pod wzgl❎dem "trickw".¢ Charakterystyczne jest tylko to, əe¢ jeəeli nast⇧pio przej③cie do kolejnej¢ linii w paternach (po kaədym wyzerowa-¢ niu licznika), to na kocu procedury¢ przerwania playera ze stosu zdejmowane¢ s⇧ cztery bajty (akumulator oraz¢ F i PC-1 dla RTI) i nast❎puje skok do¢ pocz⇧tku procedury odtwarzaj⇧cej¢ sample (songpsl = $00). Dlaczego? Ano¢ dlatego, əe wywoanie przerwania mogo¢ wyst⇧pi⇨ np. w poowie zwi❎kszania¢ adresw na ktrym③ kanale, a w czasie¢ tego przerwania na tym kanale pojawi¢ si❎ nowy d♪wi❎k i jego adres zosta¢ umieszczony w procedurze. Tak wi❎c¢ kocowym efektem braku takiego zabez-¢¢ pieczenia b❎dzie w najlepszym wypadku¢ "pykanie" w go③nikach. W najgorszym -¢ mogyby pojawi⇨ si❎ "zgrzyty". Sk⇧d¢ wiem? Gdybym tego nie zaobserwowa, to¢ zabezpieczenia tego by nie byo. :)¢ Normalne wyj③cie z procedury przer-¢ wania (PLA, RTI) nast❎puje tylko je③li¢ licznik taktuj⇧cy odtwarzanie nie¢ osi⇧gn⇧ jeszcze zera.¢ Wszystkie te cuda napisaem sam, za¢ wyj⇧tkiem procedury wykrywaj⇧cej XMS¢ autorstwa Foxa/TQA (Syzygy #7). Moja¢ jako③ nie chciaa dziaa⇨ na kompach¢ z pami❎ci⇧ poniəej 1MB... ;) a brako¢ mi czasu na szukanie pluskwy.¢ I to juə chyba wszystkie szczegy¢ techniczne dotycz⇧ce nowinek obecnych¢ w NeoTrackerze. Sam program wraz ze¢ szczegow⇧ instrukcj⇧ zosta oddany¢ na r❎ce Naczelnego, wi❎c powinien by⇨¢ gdzie③ w plikach ze stuff'em. Je③li¢ nie ma - odpowiada za to redakcja. Nie¢ mnie jest dane decydowa⇨ o zawarto③ci¢ dyskw z zinem.¢¢¢ Wiecie juə chyba, əe stali③cie si❎¢ ofiarami mojej nudy i sp♪nionego¢ geniuszu? ;) ... hmm...¢ Do programu mia by⇨ pierwotnie¢ do⇧czony jeszcze program NeoPlayer do¢ odtwarzania moduw .NEO i .MOD oraz¢ pcheka do konwersji MODw na format¢ NeoTrackera. Niestety, za sabo si❎¢ staraem. W kocu zacz❎a si❎ szkoa¢ i wszystko trafi szlag. Ale ci⇧gle¢ pracuj❎ - kompletne archiwum (Neo 1.0)¢ b❎dzie dost❎pne juə niedugo, a kolej-¢ ne, duəo bardziej rozbudowane wersje¢ juə... tuə tuə :) ...¢¢¢ A pki co miej zabawy i rwnie¢ ciekawych do③wiadcze, jak te przy¢ pisaniu NeoTrackera, əyczy¢¢¢ epi/Allegresse¢