atarionline.pl RMT + ASM + VBI = zwis przy wyjsciu do DOS'a - Forum Atarum

    Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

    • :
    • :

    Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

      • 1: CommentAuthornosty
      • CommentTime3 May 2012 10:05
       
      Trafilem na dziwne zjawisko.
      Odgrywam prostą melodyjkę + sfx korzystając z oryginalnej procedury asm dołączonej do RMT Rastera.
      Czyli co ramkę wywołuję:
      jsr RASTERMUSICTRACKER+3

      W demonstracyjnym kodzie sfx.a65 to wywolanie jest robione wewnatrz przerwania VBI. Melodyjka jest prosciutka, wiec na 100% przerwanie sie wyrabia.
      Mozna tak, mozna poza vbi. W kazdym przypadku gra mi OK.

      ALE: jesli wywoluję jsr RASTERMUSICTRACKER+3 w srodku przerwania VBI to Atari wiesza mi sie w momencie wyjścia do DOS'a!
      Sprawdzilem to dokladnie zarowno na emulcu jak i na real Atari. Nic innego nie zmieniam w kodzie, wiec na pewno wywolanie procedury grajka w przerwaniu VBI jest przyczyną.

      Do DOS'a wychodze z petli glownej po nacisnieciu klawisza ESC. Przed wyjsciem wylaczam PMG, wylaczam przerwania, wylaczam dzwiek (jsr RASTERMUSICTRACKER+9), po czym wywołuję:
      jmp ($000a)

      I jak mówiłem: wychodzi do DOS'a elegancko w kazdym przypadku oprócz takiego kiedy wewnątrz VBI wywołuje playera RMT. Wtedy sie wiesza.

      Oczywiscie obszedlem problem wywalajac wywolanie playera do petli glownej, ale ciekawi mnie czemu tak sie dzieje?
      • 2:
         
        CommentAuthorjhusak
      • CommentTime3 May 2012 17:05
       
      A jeszcze czy wyłączasz jsr RASTERMUSICTRACKER+3? wywoływany w przerwaniu pionowym?

      Bo jeśli nie, to pewnie tu leży problem.
      Przy wywoływaniu z pętli głównej automatycznie wyłączasz powyższy skok, przy odgrywaniu w przerwaniu nie.
      • 3: CommentAuthornosty
      • CommentTime3 May 2012 20:05
       
      "wyłączasz skok" to dosc karkołomne wyrazenie ;) Ale chyba kumam o co chodzi.
      Tyle ze to chyba nie moze byc przyczyna, bo przed wyjsciem do DOS'a wylaczam przerwania:
      lda #0
      sta NMIEN

      Wiec od tego momentu moja procka VBI nie powinno sie juz wykonac ani razu.
      • 4:
         
        CommentAuthorjhusak
      • CommentTime3 May 2012 23:05 zmieniony
       
      a dos sobie włączy :)
      Jak myślisz, jakby działał dos, gdyby nie było przerwania VBLK?
      Nie czytał by klawiszy np... Timery by nie działały...

      Musisz odtworzyć wektor oryginalnej systemowej procedury przerwania.
      Zapamiętujesz na początku i odtwarzasz przy wyjściu.

      Ale najprościej użyć procedury przerwania timera do odtwarzania muzyki :)
      • 5: CommentAuthorbob_er
      • CommentTime3 May 2012 23:05
       
      jeszcze prościej by było nie robić muzyki w ogóle :D.
      • 6:
         
        CommentAuthorjhusak
      • CommentTime4 May 2012 00:05
       
      Do czego nas zaprowadzi ten kierunek myślenia?
      • 7: CommentAuthortebe
      • CommentTime4 May 2012 20:05
       
      Nosty, to Twoje przerwanie VBI zapamiętuje i oddaje zawartość rejestrów A,X,Y ?
      • 8: CommentAuthornosty
      • CommentTime7 May 2012 09:05 zmieniony
       
      @tebe - oczywiscie. Samo przerwanie w czasie gry dziala poprawnie i nie powoduje klopotow.

      Teoria Jakuba ze DOS wlacza sobie przerwanie VBI nie ustawiajac wczesniej wektora wydaje mi sie mocno wątpliwa. W kazdym razie takie dzialanie jest nieodpowiedzialne :P

      Bylem na zlocie wiec nie mialem czasu na eksperymenty, ale dzis sprawdze wszystko jeszcze raz. Sprobuje min. przywracac przed wysjciem do dos'a oryginalny wektor procedury.

      BTW. Na Grzybsoniadzie omawialem ten problem z doswiadczonymi programistami i dowiedzialem sie min ze aby wrocic do DOS'a powinienem zrobic zwykly rts a nie jmp ($000a). Tez sprawdze jaki bedzie skutek.
      No i skoro na emulcu tez sie wiesza to polecono mi zrobic trace tego bledu.
      • 9: CommentAuthornosty
      • CommentTime12 May 2012 17:05
       
      Zrobilem dalsze testy. Faktycznie, jesli najpierw odtworzę oryginalny wektor przerwania ($e45f) i wychodze przez rts, to poprawnie wraca do DOS'a.
      Temat zamkniety, dzieki za pomoc.