atarionline.pl Grafika w Action! - 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:
         
        CommentAuthorCosi
      • CommentTime15 Oct 2009 16:10
       
      Chyba nigdy nie będę programował grafiki na Atari...
      Próbowałem zrobić proste przerwanie DLI w Action! Napisałem taki kod
      PROC Start()
      BYTE ARRAY DLI = [72 ... 104 64]
      CARD ADRES = 512
      Graphics(24)
      ADRES = @DLI
      ...
      RETURN

      i nic. Nieważne co wpiszę do tablicy DLI. Czy możecie mi wytłumaczyć, dlaczego?
      • 2: CommentAuthormono
      • CommentTime15 Oct 2009 16:10 zmieniony
       
      Musisz jeszcze odblokować DLI ($80) w NMIEN ($D40E) - najlepiej wpisać tam $C0 - odblokowujesz VBLKI I DLI.
      Poza tym w programie ANTICa (DLIST) musisz ustawić rozkazy wywołania przerwania (dodać $80 do kodu rozkazu np. $F0 to 8 pustych lini z wywołaniem DLI).
      • 3:
         
        CommentAuthorCosi
      • CommentTime15 Oct 2009 18:10
       
      Wielkie dzięki. Teraz co prawda program się zawiesza, ale to jakieś problemy ze wskaźnikami - do tego dojdę :)
      • 4:
         
        CommentAuthorCosi
      • CommentTime15 Oct 2009 19:10 zmieniony
       
      Działa :) Dla potomności:
      PROC START()
      BYTE ARRAY DLI =
      [72 169 222
      141 10 212
      141 24 208
      104 64]
      BYTE KLAWISZ = 764
      CARD DLPTR = 560
      BYTE POINTER Q

      Graphics(24)
      PokeC(512,DLI)
      Q = DLPTR+102
      Q^==+128
      POKE(54286,192)
      WHILE KLAWISZ=255 DO OD
      KLAWISZ = 255
      Graphics(0)
      RETURN

      Nie mam pojęcia, dlaczego @DLI daje adres przesunięty o 2 bajty...

      PS. Zamiast tablicy DLI można dać procedurę:
      PROC DLI()
      [72 ... 104 64]

      Cała reszta bez zmian.
      • 5: CommentAuthormono
      • CommentTime15 Oct 2009 20:10 zmieniony
       
      A możesz sprawdzić, czy adres ustawiany w DLIV ($200) odpowiada początkowi programu przerwania DLI (np. wypisać na ekran). Kod procedury wygląda poprawnie - odczytuję go tak:
      pha
      lda #222
      sta WSYNC
      sta COLPF2 ;kolor tła
      pla
      rti

      Samo DLI nie zawiesi systemu :)

      Edit: Możesz spróbować dla testu dodać na początek kilka NOPów: kod 234.
      • 6:
         
        CommentAuthorYosh
      • CommentTime15 Oct 2009 20:10
       
      > Nie mam pojęcia, dlaczego @DLI daje adres przesunięty o 2 bajty...

      Jest to spowodowane że DLI zawiera adres tablicy, a @DLI to adres adresu tablicy

      dokladnie jak w C: char* a char**

      czyli nie:
      ADRES = @DLI
      a:
      ADRES = DLI

      Kompilator widzac takie cos:
      BYTE ARRAY DLI = [72 104 64]

      robi z tego
      1) hmm bedzie tablica DLI
      - to ja dla nie zrobie "wskaznik" o nazwie DLI w aktualnym adresie, taki wskaznik to pewnie z 2 bajty :)
      3) = [ 23 423 543 ]
      - ooo dane sa jakies zaraz po definicji, to ja je wkleje na sile ([] w action to "na sile") a ich adres (o 2 wiekszy niz zmiennej DLI) wpisze odrazu w DLI

      Wiedza o tym pozwala przełączać tablice w locie
      np
      BYTE ARRAY DLI1 = [72 1345 64]
      BYTE ARRAY DLI2 = [72 134 64]
      BYTE ARRAY HMM ; tablica bez danych

      i potem
      HMM = DLI1 lub HMM = DLI2 przepisuje wskaznik do HMM

      Mam nadzieje, że rozjaśniłem a nie zaciemniłem

      Reasumując
      BYTE ARRAY to tylko wskaźnik na dane tablicowe.

      np
      BYTE ARRAY KOLORKI = 709 ;(na sile wpisałem adres tablicy)

      KOLORKI(0) = 255
      KOLORKI(1) = 0

      zmieni na mroczny design :P

      @ należy używać bardzo rozważnie - rzadko potrzebna
      • 7:
         
        CommentAuthorCosi
      • CommentTime15 Oct 2009 21:10 zmieniony
       
      mono: Jeżeli dobrze rozumiem, to chodzi Ci o coś takiego:
      PROC DLI()
      [72 ... 104 64]

      PROC START()
      CARD DLIPTR = 512
      PrintCE(DLIPTR)
      DLIPTR = DLI
      PrintCE(DLIPTR)
      RETURN

      Wynik:
      49358
      3811
      czyli podmienia DLIV. Musi podmieniać, bo program działa :-)

      Yosh: Też tak pomyślałem, tylko trochę mnie zmyliło, że ten "wskaźnik do tablicy" jest PO całej tablicy :D
      Wystarczy uruchomić taki kod:
      ; Uwaga: kod wyłącznie do zilustrowania przykładu
      ; NIE DO UŻYTKU w celach edukacyjnych :-D
      PROC START()
      BYTE ARRAY A = [1 2 3 4]
      CARD X,I
      BYTE J
      X = @A
      FOR I = X-4 TO X-1 DO
      J = PEEK(I)
      PRINTBE(J)
      OD
      PRINTE("-------")
      FOR I = A TO A+3 DO
      J = PEEK(I)
      PRINTBE(J)
      OD
      RETURN

      Wniosek z tego: nie ufać wskaźnikom :) Zawsze to mówiłem...
      • 8: CommentAuthormono
      • CommentTime15 Oct 2009 21:10
       
      Chodziło mi czy podmienia właściwie, a więc aby wyświetlić parę liczb z adresu, na który DLIV wskazuje po podmianie. Ponieważ znamy kod maszynowy procedury łatwo zweryfikujemy czy adres wskazuje na to, co ma być.
      Ale skoro działa to nie ma o czym mówić :D Ubzdurało mi się, że dalej są problemy.
      • 9:
         
        CommentAuthorYosh
      • CommentTime15 Oct 2009 21:10
       
      fakt:) PO... ale ze mnie Czech

      Oj oj ten pierwszy for to bardzo fuj fuj - zgadujesz położenie danych:) (tak napominam jakby ktoś jeszcze to czytał ...)

      PROC START()
      BYTE ARRAY A = [1 2 3 4]
      PRINTF("%H %H",A, @A)
      RETURN


      tak jest prościej adresy sprawdzać
      • 10:
         
        CommentAuthorCosi
      • CommentTime15 Oct 2009 21:10
       
      Yosh: To nie miało być ładne, chciałem tylko pokazać gdzie się podziały dane; położenie zgadłem, wyświetlając wcześniej oba adresy ;-)
      • 11:
         
        CommentAuthorYosh
      • CommentTime15 Oct 2009 22:10
       
      Tak też myślałem.

      Natomiast z doświadczenia wiem, że jak pokażesz taki trick bez napomnienia, że to pokazanie cechy kompilatora (nie wiem jak to zrobi effectus - ale nikt mu nie broni inaczej)

      to ludziska zaczną tego używać :):):)
      • 12:
         
        CommentAuthorCosi
      • CommentTime15 Oct 2009 22:10
       
      Co prawda to prawda. Oznaczyłem odpowiednio kod ;-)
      • 13: CommentAuthorw1k
      • CommentTime20 Jan 2011 12:01
       
      nice :)
      • 14:
         
        CommentAuthorKaz
      • CommentTime29 Mar 2011 12:03
       

      Cosi:

      Chyba nigdy nie będę programował grafiki na Atari... Próbowałem zrobić proste przerwanie DLI w Action!


      A Atalana juz probowales?
      • 15: CommentAuthorrost
      • CommentTime18 May 2011 14:05
       
      the 2nd example in post #7 is very intressting.
      A is a pointer to the array, so there is no need for an @ ; but X ( =@A ) points at the end of the array (+1) -
      is it a bug or a feature, does anybody know?
      • 16:
         
        CommentAuthorKaz
      • CommentTime21 Feb 2012 13:02
       
      Did you ask author?
      • 17: CommentAuthorw1k
      • CommentTime4 Mar 2012 09:03
       
      what in this example is bad? i have error in action!
      • 18:
         
        CommentAuthorjhusak
      • CommentTime4 Mar 2012 18:03
       
      there are probably many errors.
      The first I have noticed is that PMBASE is for write only.
      For example there is the statement PMBASE=PMBASE RSH 8
      which means tht PMBASE is zeroified always.
      • 19: CommentAuthorw1k
      • CommentTime4 Mar 2012 18:03
       
      that code is rewrirten from paper book, hm
      • 20:
         
        CommentAuthorjhusak
      • CommentTime4 Mar 2012 19:03 zmieniony
       
      They can make bugs in shorter program examples. For example famous "PILOT" from atari manual in the "rainbow highway" example, instead of plot.
      • 21: CommentAuthorw1k
      • CommentTime5 Mar 2012 10:03
       
      can someone try fix that example?:)