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
     
    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 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
     
    Wielkie dzięki. Teraz co prawda program się zawiesza, ale to jakieś problemy ze wskaźnikami - do tego dojdę :)
    • 4:
       
      CommentAuthorCosi
    • CommentTime15 Oct 2009 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 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
     
    > 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 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
     
    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
     
    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
     
    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
     
    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
     
    Co prawda to prawda. Oznaczyłem odpowiednio kod ;-)
    • 13: CommentAuthorw1k
    • CommentTime20 Jan 2011
     
    nice :)
    • 14:
       
      CommentAuthorKaz
    • CommentTime29 Mar 2011
     

    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
     
    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
     
    Did you ask author?
    • 17: CommentAuthorw1k
    • CommentTime4 Mar 2012
     
    what in this example is bad? i have error in action!
    • 18:
       
      CommentAuthorjhusak
    • CommentTime4 Mar 2012
     
    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
     
    that code is rewrirten from paper book, hm
    • 20:
       
      CommentAuthorjhusak
    • CommentTime4 Mar 2012 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
     
    can someone try fix that example?:)