Panowie!
Robiąc kiedyś Scorcha, który na A5200 działać musiał z carta, napotkaliśmy z Pirxem problem playera RMT.
Oryginalnie player ten używa samomodyfikacji kodu do... no właśnie nie bardzo wiadomo. Jest dzięki temu kilka komórek na stronie zerowej zajętych mniej i dość fikuśna procka uruchamiająca wybrany efekt za pomocą skoku względnego (podmieniany jest bajt offsetu tego skoku).
Pirx wtedy pozmieniał tę procedurę tak, by tego wszystkiego nie robiła i działała z ROM.
Teraz robiąc inny program, chciałem użyć tamtej procedury, ale niestety, Pirx przyciął ją wtedy do potrzeb konkretnej muzyki i wyciął obsługę pewnych efektów(a chyba nawet wszystkich, bo nie znalazłem tam tego fikuśnego skoku :) ), które teraz były potrzebne.
Wziąłem więc ostatnią znaną mi procedurę playera RMT i jeszcze raz to zrobiłem - tym razem inaczej, bo trzeba było zachować wszystkie efekty.
No i daję ją Wam teraz.
Jest - tak jak oryginał - kompilowana warunkowo, więc w zależności od użytych w muzyce efektów zajmuje mniej lub więcej miejsca.
Użyłem dyrektywy MADS ".zpvar" dla wszystkich zmiennych na stronie zerowej, więc w swoim programie wystarczy zadeklarować początek tego obszaru (a najlepiej używać jej dla wszystkich swoich zmiennych na ZP :) ).
Jedyne co, trzeba zrobić, by działała z ROM, to przenieść gdzieś blok pozostałych zmiennych - oznaczony w kodzie.
Dodatkowo dodałem funkcję PSEUDOSTEREO.
Wystarczy dodać w pliku feat.txt (lub gdziekolwiek w kodzie) linijkę:
PSEUDOSTEREO equ 1
i jeśli gramy muzykę monofoniczną na jednym POKEYu (parametr STEROMODE = 0) to będzie grana na dwóch z przesunięciem o ramkę. Daje to efekt lekkiego pogłosu pomiędzy kanałami stereo - sprawdźcie w Scorchu :)
W stosunku do oryginału objętość kodu będzie nawet mniejsza (jeśli używamy wielu efektów) lub o kilka bajtów większa (jeśli efektów nie używamy). Różnice minimalne.
Na stronie zerowej rezerwuje o 3 (jeśli nie ma efektów i stereo) do 8 (jeśli użyte są wszystkie efekty i stereo) bajtów więcej niż oryginał.
Pseudo stereo wydłuża kod (w stosunku do standardowego mono) o 4 bajty.
Po krótkiej dyskusji tutaj: https://atarionline.pl/forum/comments.p … e=1#Item_8 dodałem jeszcze jedną funkcję.
Wystarczy zadeklarować w pliku feat.txt (albo gdziekolwiek w kodzie):
SFX_PRIOR equ 1
Co to daje poza wydłużeniem playera o 13 bajtów i zajęciem dodatkowego bajtu na stronie zerowej ? :)
Powoduje, że efekty mają priorytet nad muzyką.
Normalnie jest tak, że jeśli odpalamy efekt na którymś kanale w trakcie odtwarzania muzyki i kanał ten jest przez muzykę wykorzystywany to efekt "wcina się" w muzykę, ale jeśli w czasie wybrzmiewania efektu (w szczególnym przypadku może być to jedna ramka po jego rozpoczęciu) player akurat ma zagrać kolejną nutkę na tym samym kanale, to przerwie granie efektu (muzyka ma priorytet).
Po włączeniu tej opcji do czasu pełnego wybrzmienia efektu na danym kanale nutki się nie odgrywają. Czyli priorytet mają efekty.