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 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 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
     
    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 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
     
    @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 zmieniony
     
    @larek, poniżej filmik z poszarpanymi krawędziami.

    ->link<-
    • 7:
       
      CommentAuthorlarek
    • CommentTime8 Nov 2015 zmieniony
     
    Sprawdzałeś to na Atari, czy tylko na emulatorze?

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

    • 8:
       
      CommentAuthorkris3d
    • CommentTime8 Nov 2015
     
    na EMU z włączoną i z wyłączoną opcją "Vsync" jest to samo.
    Emulator Altirra.
    • 9:
       
      CommentAuthorlarek
    • CommentTime8 Nov 2015
     
    A na Atari?
    • 10: CommentAuthormono
    • CommentTime8 Nov 2015 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
     
    pause 0
    • 12:
       
      CommentAuthorkris3d
    • CommentTime9 Nov 2015
     
    @mono, dzięki za trik już próbowałem ale nie zadziałało. Walczę nadal:)
    • 13:
       
      CommentAuthorjhusak
    • CommentTime9 Nov 2015 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
     
    @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 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
     
    @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 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
     
    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 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
     
    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
     
    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
     
    .. 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 ;)