Tajemnice ATARI

O CMC raz jeszcze...

    Mimo zamieszczonych w Tajemnicach ATARI rad oraz dość obszernej instrukcji dołączanej do programu, otrzymujemy nadal dużo listów w sprawach dotyczących korzystania z Chaos Music Composera. Z wielu poruszanych przez użytkowników problemów wybrałem te, które wydają ml się najbardziej istotne oraz te, które wymagają szerszego omówienia.

    Pierwszą ważną sprawą jest sprostowanie błędu, który został popełniony przez autora artykułu "Chaos Music Composer - to wcale nie jest trudne" (TA 8/92). Napisał on: "...wybierz najwyższą oktawę (CONTROL + GÓRA) i naciśnij klawisz P.". Niestety, po naciśnięciu tego klawisza nic się nie dzieje, ponieważ najwyższa oktawa kończy się na klawiszu "O" i oczywiście ten klawisz powinien być wciśnięty w celu uzyskania brzmienia werbla. W tym samym artykule czytamy: "Wczytaj np. demo BLUEMON...". Autor korzystał ze stacji dysków, więc podanie nazwy pliku demonstracyjnego do załadowania wydało mu się sprawą oczywistą. Zapomniał jednak o użytkownikach magnetofonu, którzy mogą nie wiedzieć, o jakim pliku mowa. Pokrótce przedstawię jego charakterystyczne cechy.

    Okno song wygląda następująco:

00: -- 01 --
01: -- 01 02
02: R: 01 02
03: 00 01 02
04: 11 -- --

    Tempo utworu to 06, a wszystkie instrumenty - "user_def".

    Drugą dość istotną sprawą jest wykorzystanie skomponowanej muzyki we własnym programie. Jeśli chodzi o BASIC, to sprawa wydaje się prosta, gdyż przykładowy program DEMO.BAS teoretycznie zrobi za nas wszystko. Jednak tak nie jest i tu także pojawiły się kłopoty. Napisał do nas autor programu demonstracyjnego, któremu przestawała grać muzyka po wykonaniu instrukcji GRAPHICS 15. Powodem tego był standardowy adres ładowania muzyki, równy $8400. Zaraz za muzyką znajduje się moduł odtwarzający, który jest kasowany przez instrukcję GRAPHICS 15. W efekcie program grający wywołuje procedurę, której już nie ma i po prostu się zawiesza. Aby uniknąć takiej sytuacji, należy w programie CMC przed nagraniem pliku zmienić adres na $7000. Służy do tego kombinacja klawiszy CONTROL i A. Automatycznie ustawi się też adres ładowania modułu odtwarzającego. Trzeba jednak pamiętać o tym, by moduł kończył się przed niebezpiecznym obszarem pamięci (początek tego obszaru zależy od trybu graficznego). Po zgraniu powinno to wszystko działać, należy jednak pamiętać, aby program w BASIC-u nie był zbyt długi, gdyż "nadepnie" na początek naszej muzyki. Najskuteczniejszą metodą uchronienia się przed takim wypadkiem jest ustawienie tzw. memtop poniżej adresu początku muzyki. Wykonujemy to, pisząc w programie POKE 106,112. Ta instrukcja ochroni naszą muzykę przed zniszczeniem przez program BASIC-owy. Jednak ceną za ochronę naszego programu jest zmniejszona ilość wolnej pamięci RAM. Uważam, że po tych uwagach każdy średniozaawansowany użytkownik będzie umiał odgrywać muzykę w dowolnym trybie graficznym BASIC-a.

    Jeśli chodzi o odgrywanie muzyki z poziomu assemblera, to przedstawię krótki program, który odgrywa muzykę podczas przerwania synchronizacji pionowej vblkd. Polecam jego samodzielną analizę z instrukcją obsługi CMC (str. 17-20) w ręce.
* CMC player by MP's
* (c) 1992 Tajemnice ATARI

        opt %10101

setvbl  equ $e45c
exitvbl equ $e462
vvblkd  equ $0224
kbcodes equ $02fc
border  equ $02c8

vblkd   equ $07

*--- adresy w module
m_adr   equ $xxxx  adres modulu
s_adr   equ $xxxx  adres muzyczki

m_init  equ m_adr+$03
m_tact  equ m_adr+$06

voltr1  equ m_adr+$09
voltr2  equ m_adr+$0a
voltr3  equ m_adr+$0b

*--- komendy dla modulu
p_song  equ $00
p_atpos equ $10
p_instr equ $20
p_tempo equ $30
p_coda  equ $40
p_break equ $50
p_cont  equ $60
p_init  equ $70

        org $480

*--- zachowal stary adres przerwania
        lda vvblkd
        sta hlp_w+1
        lda vvblka+1
        sta hlp_w+2

*--- inicjalizuj
        lda s_adr
        lda #p_init
        jsr m_init

*--- graj muzyke
        lda #p_song
        tax
        jst m_init

*--- inicjalizuj nowe przerwanie
        ldy play
        lda #vblkd
        jsr setvbl

*--- czekaj na klawisz
        lda #$ff
loop    cmp kbcodes
        beq loop
        sta kbcodes
        
*--- oddaj stary wektor przerwania
        ldy hlp_w+1
        ldx hlp_w+2
        lda #vblkd
        jst setvbl

*--- zakoncz gre
        lda #p_coda
        jsr m_init
        rts

*--- procedura taktujaca
play    jsr m_tact
        lda voltr1
        clc
        adc voltr2
        sta border
hlp_w   jmp *

        end of file


Marek Pasek




Powrót na start | Powrót do spisu treści | Powrót na stronę główną

Pixel 2002