atarionline.pl początki w TBXL - znaki, PMG, RAMTOP... - 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: CommentAuthortbxx
      • CommentTime19 Oct 2015 13:10 zmieniony
       
      w TBXL muzykę z Chaos Music Composer ładujesz:
      BLOAD "D1:MUZYKA.CMC"

      Player ładujesz:
      BLOAD "D1:MUZYKA.REP"

      w CMC sprawdzasz pod jakie adresy ładuje się muzyka i player

      odgrywasz muzykę przez:

      GRAJ=USR(Adres PLAYER'a,nr utworu,Adres MUZYKI)

      a kończysz grać przez:

      NIEGRAJ=USR(Adres PLAYER'a)

      ---------------------------------------------
      odnośnie trybu "15" a raczej "12" - jak można policzyć gra wymaga rozdzielczości 192x192. Do tego "gotowe" picrossy mają 9 kolorów.
      • 2: CommentAuthormono
      • CommentTime19 Oct 2015 13:10 zmieniony
       
      Tryb 12 BASIC (4 ANTIC) daje Ci 3 kolory piksela w ramach znaku (+ oczywiście tło COLBAK dla piksela %00); piksel %11 brany jest z COLPF2 lub COLPF3 zależnie od 7 bitu znaku.
      W obszarze gry masz 16 kolumn więc można tam położyć playery w poczwórnej szerokości w trybie multicolor co da Ci dodatkowe 3 kolory nad tłem (piksele %00) a pod pikselami pola gry (%01, %10, %11) o ile ustalisz priorytet sprajtów na %0100 (COLPFx, COLPMx, COLBAK).
      Do dyspozycji miałbyś więc wszystkiego 8 kolorów bez potrzeby wykorzystania assemblera i tricków na DLI.
      Można też połączyć missile w jednego sprajta - wtedy kolor dla każdego missila brany jest z COLPF3 (a więc z rejestru koloru wykorzystywanego dla piksela %11 gdy bit 7 znaku jest ustawiony), co dawałoby Ci możliwość wykorzystania tego koloru łącznie z pikselami %11 o kolorze branym z COLPF2 (czyli gdy bit 7 znaku jest skasowany) w wybranych kolumnach.

      Konkludując: przy takiej konfiguracji masz 2 stałe kolory dla pikseli %01 i %10, 4 rozłączne kolory tła dla piksela %00 (1 kolor COLBAK i 3 kolory pochodzące z playerów przykrywających tło, ale nie przykrywających pikseli znaku) i 2 rozłączne kolory dla piksela %11 (zależnie od stanu bitu 7 znaku w pamięci ekranu).

      Edit: Missile mógłbyś wykorzystać do podkolorowania wyróżnionego wiersza w pierwszych 8 kolumnach ekranu. Używając dwóch DLI mógłbyś je wykorzystać też do podkolorowania wyróżnionej kolumny na górze ekranu.
      No albo znaków z ustawionym bitem 7 bo to ten sam kolor.
      • 3:
         
        CommentAuthorkris3d
      • CommentTime7 Nov 2015 11:11
       
      Przysposobiłem kod z TA odnośnie sprajtów i spróbowałem je pozmieniać i zanimować, wszystko fajnie chodzi tak jak chciałem, z jednym małym ale: sprajty są "poszarpane" na pionowych krawędziach. Bocianu sugerował że to problem z WSYNC.

      Czy da się a jeśli tak to jak ustawić prawidłowo POKE-a dla komórki odpowiadającej za WSYNC? Czy trzeba

      Przestawienie wszystkich IF-ów przed/za POKE-i odpowiadające za pozycje na ekranie nie pomaga.

      Przykład kodu poniżej (TBXL),

      1 POKE 106,PEEK(106)-4:GRAPHICS 15:PMB=PEEK(106):FOR I=PMB*256+384 TO PMB*256+1024:POKE I,170:NEXT I
      2 POKE 54279,PMB:POKE 623,1:POKE 623,2:POKE 623,6:POKE 623,12
      3 POKE 623,1+16:POKE 53277,3:POKE 53256,3:POKE 53257,1:POKE 53258,0:POKE 53259,2:POKE 53248,112:POKE 53260,255
      4 POKE 53249,48:POKE 53250,80:POKE 53251,144:POKE 53255,176:POKE 53254,184:POKE 53253,192:POKE 53252,200
      5 POKE 559,46:POKE 704,35:POKE 706,46:POKE 707,140:POKE 705,90:POKE 711,12:POKE 710,76:POKE 709,15
      10 I=0:I2=0:I3=0:I4=200:I5=200
      20 EXEC RU01
      30 PROC RU01
      40 FOR I=0 TO 200
      50 POKE 53250,I
      60 IF I=200 THEN I=0
      70 IF I2=200 THEN I2=0
      80 IF I3=200 THEN I3=0
      90 IF I4=0 THEN I4=200
      100 IF I5=0 THEN I5=200
      110 IF I MOD %2 THEN I2=I2+1:POKE53249,I2
      120 IF I MOD %3 THEN I3=I3+2:POKE53251,I3
      130 IF I MOD 4 THEN I4=I4-1:POKE 53252,I4
      140 IF I MOD %3 THEN I5=I5-2:POKE53253,I5
      150 NEXT I
      155 PAUSE 2
      160 ENDPROC
      170 EXEC RU01
      • 4:
         
        CommentAuthorlarek
      • CommentTime7 Nov 2015 13:11 zmieniony
       
      A możesz pokazać (film, zrzut ekranu), o jakie szarpanie chodzi?

      Wydaje mi się, że robienie cokolwiek z WSYNC z poziomu Basica jest bezcelowe.

      Nie bardzo rozumiem (ale co ja tam wiem), o co chodzi w takiej konstrukcji:
      40 FOR I=0 TO 200
      ...
      60 IF I=200 THEN I=0
      ...
      150 NEXT I
      • 5:
         
        CommentAuthorkris3d
      • CommentTime7 Nov 2015 14:11
       
      @larek, taki efekt widać na filmiku od tbxx w drugim wątku o TBXL(jeden spite się przesuwa i widać jego poszarpane "pionowe krawędzie" (hmmm, przypomiały mi się "pionowe korytarze" posłanki Beger;))

      2. Ta pętla "ogarnia" ruch sprajtów a "IF" powoduje że jeśli pozycja pozioma (tutaj zmienna I) osiągnie 200, sprajt ląduje na pozycji 0. To może być oczywiście fakap programistyczny bo ja to się naprawdę nie znam:) i to k...jest fakap;) doczytałem i wiem że to fakap:)
      • 6:
         
        CommentAuthorkris3d
      • CommentTime8 Nov 2015 09:11 zmieniony
       
      @larek, poniżej filmik z poszarpanymi krawędziami.

      • 7:
         
        CommentAuthorlarek
      • CommentTime8 Nov 2015 10:11 zmieniony
       
      Sprawdzałeś to na Atari, czy tylko na emulatorze?

      W emulatorze masz włączoną opcję Vertical Sync?

      • 8:
         
        CommentAuthorkris3d
      • CommentTime8 Nov 2015 11:11
       
      na EMU z włączoną i z wyłączoną opcją "Vsync" jest to samo.
      Emulator Altirra.
      • 9:
         
        CommentAuthorlarek
      • CommentTime8 Nov 2015 12:11
       
      A na Atari?
      • 10: CommentAuthormono
      • CommentTime8 Nov 2015 14:11 zmieniony
       
      Zmiana pozycji poziomej sprajta odbywa się na ekranie widzialnym (linie 8..248). Jeśli chcesz tego uniknąć zmieniaj pozycję sprajta poza tym obszarem (0..7 i 248..311). Najprościej zsynchronizować się z VBLK.
      A można to zrobić np. przez sprawdzenie zmiany RTCLOK ($12):
      lda RTCLOK+2
      ?wait:
      cmp RTCLOK+2
      beq ?wait
      • 11:
         
        CommentAuthorpirx
      • CommentTime8 Nov 2015 23:11
       
      pause 0
      • 12:
         
        CommentAuthorkris3d
      • CommentTime9 Nov 2015 17:11
       
      @mono, dzięki za trik już próbowałem ale nie zadziałało. Walczę nadal:)
      • 13:
         
        CommentAuthorjhusak
      • CommentTime9 Nov 2015 23:11 zmieniony
       
      Trik @mono to nie trik. Tak się robi, zmieniasz pozycje wszystkich sprajtów na/bezpośrednio po pionowym przerwaniu.

      W tym programiku w BASIC aby zadziałało, musisz przygotować dwie zmienne z dwoma pozycjami każda (powiedzmy typu WORD, 256 * poz 1 + poz2), a następnie szybko czyli w tej samej linii po załapaniu przerwania (czyli np. pause 0) je wpisać do pozycji sprajtów. Wówczas jeśli będziesz miał poszarpane, to przynajmniej w mniej więcej tym samym miejscu.
      • 14:
         
        CommentAuthorkris3d
      • CommentTime10 Nov 2015 14:11
       
      @jhusak, dzięki za podpowiedź. "Ładnie" zadziałało PAUSE 0 tuż przed POKE-ami i nic nie jest poszarpana, ale program spowolnił bardzo.

      Sama procedura wygląda tak:

      30 PROC RU01
      40 FOR I=0 TO 200
      60 IF I=200 THEN I=0
      70 IF I2=200 THEN I2=0
      80 IF I3=200 THEN I3=0
      90 IF I4=0 THEN I4=200
      100 IF I5=0 THEN I5=200
      110 IF I MOD %2 THEN I2=I2+1
      120 IF I MOD %3 THEN I3=I3+2
      130 IF I MOD 4 THEN I4=I4-1
      140 IF I MOD %3 THEN I5=I5-2
      150 PAUSE 0
      160 POKE 53250,I:POKE 53249,I2:POKE 53252,I4:POKE 53251,I3:POKE 53253,I5
      165 NEXT I
      170 ENDPROC

      a więc coś z wydajnością jeszcze pewnie da się wykombinować.
      • 15: CommentAuthormono
      • CommentTime10 Nov 2015 15:11 zmieniony
       
      To nie tak chyba. Szarpało, bo kilka razy na ramkę zmieniałeś pozycję sprajta POKE-ami. Kiedy dodałeś synchronizację zmiana odbywa się tylko raz, po czym program czeka na VBLK. Jeśli chcesz zachować tempo, zwiększ delty Ix.
      Zmienne numeryczne są w BASIC-u zmiennoprzecinkowe, więc zamiast IF x MOD y możesz użyć x=x+1/y. POKE i tak wpisze do komórki część całkowitą.

      Edit: Chodzi mi o ten fragment:
      70 IF I2=200 THEN I2=0
      80 IF I3=200 THEN I3=0
      90 IF I4=0 THEN I4=200
      100 IF I5=0 THEN I5=200
      110 IF I MOD %2 THEN I2=I2+1
      120 IF I MOD %3 THEN I3=I3+2
      130 IF I MOD 4 THEN I4=I4-1
      140 IF I MOD %3 THEN I5=I5-2

      - coś w tym stylu:
      110 I2=I2+1/2 MOD 200
      120 I3=I3+2/3 MOD 200
      130 I4=I4-1/4 MOD 200
      140 I5=I5-2/3 MOD 200

      Skoro I=200 ma się zmienić na 0, to może zamiast FOR użyć I=I+1 MOD 200 oraz GOTO?
      Stałe można zapisać jako liczbę a nie operację, no i przypisać zmiennym roboczym.
      Zapisanie operacji w jednej linii też powinno nieco zoptymalizować.
      Inna sprawa czy jest sens optymalizować tę część kodu, skoro po jej wykonaniu i tak czekamy na VBLK :D
      • 16:
         
        CommentAuthorkris3d
      • CommentTime10 Nov 2015 16:11
       
      @mono, dzięki. Zastąpienie:

      IF I MOD %2 przez IF I=I+1/2 spowodowało że sprajt dla tego IF-a zniknął:) Co robię nie tak?
      • 17: CommentAuthormono
      • CommentTime10 Nov 2015 16:11 zmieniony
       
      Ale ja tam nie dawałem IFów :)

      Poza tym ja się nie znam na TBXL - musisz ideę twórczo przetworzyć :)
      • 18: CommentAuthorKrzys
      • CommentTime27 Mar 2021 19:03
       
      Dopiszę się do wątku. Czy obszar DOSa, który jest pod interpreterem w 0700-2080, to jest do wykorzystania, gdybyśmy nie chcieli korzystać już z D:? Jeśli tak, to czy trzeba coś gdzieś zaznaczyć, że DOS jest nadpisany, czy po prostu można jechać?
      • 19:
         
        CommentAuthorjhusak
      • CommentTime27 Mar 2021 23:03 zmieniony
       
      Jak nie wyczepisz z resetu inicjacji dosa, to się zawiesi po resecie. Jak nie bedziesz używał io z urządzeniem „d” to możesz jechać. Jak wyczyścisz hatabs z handlera D, to już w ogóle ok.

      Na emulatorze atari800 możesz używać „H” i będziesz miał pamięć programu od najniższego możliwego adresu, ale użyć tego na Real Atari będzie problem.
      • 20: CommentAuthorKrzys
      • CommentTime28 Mar 2021 19:03
       
      Kuba, dziękuję. To chodzi o normalny sprzęt.

      Czyli żeby wypiąć, wystarczyłoby do DOSVEC wpisać TESTROM, tak jak normalnie startuje bez DOSa?
      • 21:
         
        CommentAuthorjhusak
      • CommentTime31 Mar 2021 00:03
       
      Nie wiem :) Na pewno przywrócenie stanu sprzed inicjacji dosa jest dobre. No i ten hatabs, żeby błąd zwracało odwołanie do D, a nie zawieszkę.
      • 22: CommentAuthorpin
      • CommentTime31 Mar 2021 01:03
       
      .. czyli początki rozprawki o TBXL dla początkujących to jest opowieść pt.: "jak wywalić dosa w kosmos na dzień dobry".

      Skończy się na przypadkowym nadpisaniu romu bez programatora epromów ;)