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
     
    Zwizualizuj to sobie w G2F i wyeksportuj do ASM - będziesz widział, co się dzieje po drodze.
    • 3:
       
      CommentAuthorpirx
    • CommentTime29 Jun 2022
     
    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 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
     
    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
     
    Z trzeciej strony kolega chciał to chyba zrobić w Atari Basic, a nie w asemblerze czy Action! :D
    • 7:
       
      CommentAuthorsun
    • CommentTime30 Jun 2022
     
    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
     
    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
     
    Lukasz dalej czeka na x=usr(1536)
    • 10:
       
      CommentAuthorpirx
    • CommentTime1 Jul 2022 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
     
    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
     

    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 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
     

    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
     
    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
     
    @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 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