atarionline.pl Display List w Atari Basic - 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.  
      Cześć,

      napisałem taki oto fragment kodu w Basicu:

      10 GRAPHICS 7+16
      20 DL=PEEK(560)+PEEK(561)*256
      30 POKE DL+3,70:POKE DL+6,6
      40 POKE DL+50,141
      50 POKE DL+100,65:POKE DL+101,PEEK(560):POKE DL+102,PEEK(561)
      60 FOR I=1 TO 10:READ J:POKE 1536+I,J:NEXT I
      70 DATA 72,169,20,141,10,212,141,22,208,104,64
      80 POKE 54286,192
      90 POKE 512,0:POKE 513,6

      W ten sposób uzyskałem tryb graficzny nr 7 z dwiema liniami trybu nr 1 (u góry ekranu) oraz zmianą koloru nr 1 od linii 50 trybu 7.

      Chciałbym jednak dodatkowo:
      1) albo zmienić inne kolory (nr 2 i 3), ale koniecznie od innej linii niż 50 (potrafię to zrobić ale od tej samej linii)
      2) albo chociaż pozostać przy tej jednej zmianie, ale aby u dołu ekranu powrócić do poprzedniego koloru nr 1
      3) albo po prostu ustawić inne kolory dla trybu 1 i inne dla trybu 7.

      Problem więc sprowadza się do tego, że linia nr 40 kodu dokonuje zmiany w display list od konkretnej linii (tutaj 50), ale dotyczy to wówczas wszelkich zmian kolorów (nawet jeśli takie wprowadzę dla koloru 2 i 3 na zasadach jak w linii 60 i 70 kodu). Nie wiem natomiast jak sprawić aby uzyskać zmianę innych kolorów (2 i 3) od innej linii niż 50 albo aby z kolorem nr 1 powrócić do poprzednich ustawień u dołu ekranu sprzed zmiany albo po prostu ustawić zupełnie inne kolory dla trybu 1 i 7.

      Dzięki za ewentualną pomoc!

      Pozdrawiam,
      LukLab
      • 2:
         
        CommentAuthorMaW
      • CommentTime28 Jun 2022 23:06
       
      Zwizualizuj to sobie w G2F i wyeksportuj do ASM - będziesz widział, co się dzieje po drodze.
      • 3:
         
        CommentAuthorpirx
      • CommentTime29 Jun 2022 19:06
       
      hello,
      masz jedno przerwanie DLI i to jest OK, jak chcesz zrobić jedną zmianę, ale jak życzysz sobie kilka różnych zmian, to chyba najprościej porobić sobie tablice i licznik przrwań DLI. Wtedy dobrze by było na VBL ustawiać licznik DLI na 0, bo jeśli coś wyłączy przerwanie, to się pozycja poprzesuwa i będziesz miał śmieszne kolorki.

      ja to bym tak zakodził (z pamięci piszę, może być źle)
      org $600
      ; setup DL itp...
      ; ....
      ; ustawienie VBL
      ldy #<VBL
      ldx #>VBL
      lda #7 ;VVBLKD
      jsr SETVBV
      ; ustawienie DLI
      ldy #<DLI
      ldx #>DLI
      lda #$c0
      sty $200
      stx $201
      sta NMIEN
      rts

      VBL
      pha
      lda #0
      sta DLICounter
      pla
      jmp XITVBV ; (chyba)

      DLI
      pha
      txa
      pha
      ldx DLICounter
      lda DLIColorsTable,x
      sta COLPF0 ; wstawionko do rejestu koloru wybranego
      inx
      stx DLICounter ; counter += 1
      pla
      tax
      pla
      rti

      DLIColorsTable
      .by $10, $26, $3f ; liczba wpisów równa liczbie przerwań DLI na ekranie
      DLICounter .by 0


      To oczywiście można znacznie poprawić, może też będziesz musiał powstawiać trochę NOPów przed sta COLPFx, żeby się kolorek ładnie od krawędzi zaczynał. Ew. sta WSYNC.

      Jeśli chcesz zmienić kilka kolorków, to potrzebujesz większej liczby tablic.
      • 4:
         
        CommentAuthortdc
      • CommentTime30 Jun 2022 16:06 zmieniony
       
      Na warsztacie z Action! cały czas implementowaliśmy zmiany kolorów w dowolnej ilości, tu 26 kolorów na ekranie.

      W Action! robi się to szybko, łatwo i bez asemblera;)
      • 5:
         
        CommentAuthorPecus
      • CommentTime30 Jun 2022 22:06
       
      Z drugiej strony w asemblerze robi się to bardzo szybko, łatwo i bez Action! :P

      Co wyżej pokazał Paweł.
      • 6:
         
        CommentAuthorKaz
      • CommentTime30 Jun 2022 23:06
       
      Z trzeciej strony kolega chciał to chyba zrobić w Atari Basic, a nie w asemblerze czy Action! :D
      • 7:
         
        CommentAuthorsun
      • CommentTime30 Jun 2022 23:06
       
      bez asm takich rzeczy w basicu się nie da :( co kolega zauważył, bo ma w basicu prockę w asm do dli.
      • 8:
         
        CommentAuthorKaz
      • CommentTime1 Jul 2022 00:07
       
      To prawda, ale z piątej strony ;) chyba chodzi o to, żeby modyfikować program w Atari Basic, więc trzeba podać mu kody Basica albo pokazać, jak przetłumaczyć mnemoniki asemblera na kody Basica.
      • 9: CommentAuthorsolo/ng
      • CommentTime1 Jul 2022 01:07
       
      Lukasz dalej czeka na x=usr(1536)
      • 10:
         
        CommentAuthorpirx
      • CommentTime1 Jul 2022 01:07 zmieniony
       
      to jeszcze trza
      PLA
      dodać na przedzie

      Ale Łukaszu, naszrajbuj, co czaisz, a co nie - czy umiesz z asemblera na DATA przerobić. jak nie, to pomożem.
    2.  
      cześć,

      faktycznie, potrzebuję to w Basicu bo asemblera nie ogarniam:-(
      Z napisanego kodu rozumiem, że POKE DL+50,141 wprowadza przerwanie do koloru, dalej linie od 60 do 90 to niezbędne dane, z czego w linii 70 liczba 20 to nowy kolor (wiem jak zmienić), a 22 oznacza, że zmieniamy kolor nr 1 (potem odpowiednio 23 i 24 to kolor 2 i 3). Reszty danych w linii 70 za bardzo nie czaję. Po prosu pisząc ten fragment posiłkowałem się dostępnymi publikacjami.

      Jak wcześniej wskazałem najbardziej zależałoby mi na innych kolorach dla dwóch pierwszych linii ekranu (trybu nr 1) i innych dla pozostałych (trybu nr 7). Ale jeśli to zbyt skomplikowane lub kod byłby znacząco dłuższy (nie mogę sobie na to pozwolić z uwagi na obszerność całego programu), to będę też mega zadowolony jeśli uda się po prostu z tym kolorem nr 1 powrócić na dole ekranu (powiedzmy dla linii 90 i dalej) do ustawień sprzed przerwania.

      Niecierpliwie czekam :-)
      • 12:
         
        CommentAuthorpirx
      • CommentTime1 Jul 2022 15:07
       
      ok, no to tak łatwo się nie da bez choćby częściowego zrozumienia, o co chodzi.
      w wierszu 70 jest zakodowany program obsługi DLI, czyli coś, co powinno być zmodyfikowane, jeśli chcesz mieć wiele różnych zmian na ekranie.
      To dlatego, że w każdym miejscu ekranu, dla którego wstawisz do DL wartość > 128 (jak w wierszu 40) wykona się ten sam program przerwania.
      Więc żeby coś się zmieniało, to za każdym razem, gdy wykonuje się DLI trzeba coś w nim zmienić. W tym przykładzie ode mnie zmieniam licznik - wskaźnik do tablicy.
      Jeśli Cię to nie bardzo interesuje i chcesz mieć gotową linię DATA, to może ktoś inny pomoże ;]
      • 13:
         
        CommentAuthortdc
      • CommentTime2 Jul 2022 09:07
       

      pecus:

      Z drugiej strony w asemblerze robi się to bardzo szybko, łatwo i bez Action! :P

      Nie prawda, nie byłeś na naszym warsztacie więc nie wiesz jak łatwo i szybko się to robi.

      pecus:

      Co wyżej pokazał Paweł.

      Przykład Pawła pokazał że nie robi się tego szybko, nie robi się łatwo;)
      ...o zamianie mnemoników w kody DATA nie wspominając...
      • 14:
         
        CommentAuthorPecus
      • CommentTime2 Jul 2022 18:07 zmieniony
       
      Tomek, please. Nie pisz znowu bzdur.
      Nie da się w Action! ogarnąć DLI bez assemblera/kodu maszynowego. A jeśli się da to co za liczby trzymasz w nawiasach kwadratowych??

      Pytanie było o BASIC, w którym odpowiednikiem Twoich wstawek w nawiasach kwadratowych w Action! są liczby w liniach DATA.
      I jedno i drugie to kod maszynowy, którego TRZEBA użyć (w uproszczeniu mówimy "assembler", bo finalnie sprowadza się to do znajomości mnemoników).
      A Ty w odpowiedzi na pytanie o rozwiązanie w BASICu proponujesz Action! - i co?, może po skompilowaniu programu w Action!, który zawiera program w assemblerze, kolega ma sobie przepisać to do linii DATA?

      Dlatego prościej i szybciej poznać te kilka mnemoników Assemblera, a przy okazji pozwala to zrozumieć co tam się dzieje, co bardzo ułatwi dalszą pracę nad programem.

      A przykład Pawła pokazał właśnie, że robi się to szybko, bo użył w nim standardowych konstrukcji stosowanych zawsze do tego celu - tak powtarzalnych, że w każdym kulturalnie napisanym programie (pozdrawiam XXLa ;) ) ogarniającym przerwania DLI + VBL są one identyczne.

      I żeby zrobić to w Action! też musisz wiedzieć jak to wygląda w assemblerze, bo inaczej piszesz kod nie rozumiejąc jak działa.

      P.-S. Nie muszę uczestniczyć w Twoich warsztatach by umieć programować w Action! - robiłem w nim i przerwania DLI i VBL i stąd wiem, że do tego celu assembler jest najlepszy.
      • 15:
         
        CommentAuthortdc
      • CommentTime3 Jul 2022 03:07
       

      Pecus:

      Nie da się w Action! ogarnąć DLI bez assemblera/kodu maszynowego.

      Nie byłeś na warsztacie to nic nie wiesz.

      To taka reguła, że jak nie wiesz to się wypowiadasz??
      • 16:
         
        CommentAuthorPecus
      • CommentTime3 Jul 2022 11:07
       
      Oczywiście, Twoje "warsztaty" to wiedza objawiona. A jak ktoś nie był to nic nie wie :P
      Zapytam tylko jak w Action! bez użycia kodu maszynowego przechowujesz i odtwarzasz rejestry procesora w przerwaniu DLI ?

      I żeby było w Twoim stylu... jeśli nie odpowiesz, to dyskusja z Tobą nie ma sensu :P
      • 17:
         
        CommentAuthorshanti77
      • CommentTime3 Jul 2022 11:07
       
      @Pecus TDC korzysta tam z licznika VCOUNT, czeka po prostu na określoną linię i zmienia wtedy różne rejestry ;)
      • 18:
         
        CommentAuthorPecus
      • CommentTime3 Jul 2022 11:07 zmieniony
       
      Czyli prymitywnie, bez DLI i VBL, to po co w tym wątku TeDeC odpowiada, kiedy dotyczy on DLI ?

      Poza tym takie "kombinowanie" nada się tylko do statycznego obrazka, a kolega pyta o coś innego.

      Ech a podobno, to inni zawsze piszą nie na temat, a Tomek zawsze dokładnie w temacie :P