Jest trochę zbugowany. :O Jeśli wykorzystujemy rejestr $ffff8265 (a musimy, żeby było płynnie i ładnie :P), to przy przejściu z wartości niezerowej na 0 można zauważyć parszywe migotanie ekranu. Sporo czasu zajęło mi, po pierwsze stwierdzenie, że ja czegoś nie spieprzyłem, a po drugie znalezienie odpowiedniego rozwiązania: należy zmieniać wartość rejestru PO wyświetleniu całego widocznego obrazu, czyli wykorzystać HBL lub odpowiednio skonfigurowany timer B. Może komuś przyda się ta wiedza kiedy zobaczy, że mu ekran w czasie vscrolla miga. :D

2

Hej,
Coś jest nie tak. Takie tricki nie są potrzebne. Aha, rozumiem, że chodzi o hscroll jak w tytule..... a nie vscroll jak na końcu posta, tak?
Wydaje mi się, że zapomniałeś o jednym małym ale przy aktualizacji rejestru $ffff8265. Jeżeli wrzucasz w niego coś innego niż 0 to shifter automatycznie będzie pobierać o 16px więcej z framebuffer'a.
Czyli jeśli Twoj framebuffer to 640px i robisz hscroll ste to przy przesunieciu PX = 0 (w rejestrze 8265) to szerokosc framebuffer'a ustawiasz na 640px, ale jeśli masz przesuniecie PX z zakresu 1-15 to musisz to skompensować i ustawić szerokość framebufffera na 640-16px. Pewnie tego nie zrobiłeś i dlatego przy przejsciu z zerowych na niezerowe warotości masz kaszanke.

Kod wyjęty z takeover (z boobswatch part):

boobs_hscroll_vbl:
            movem.l    d0-d2,-(a7)
            move.l  scr1,d0
            add.l    boobs_hscroll_byteOffset,d0

            move.l    d0,d1
            lsr.l #8,d1
            
            move.l    d1,d2
            lsr.w #8,d2
            
            ; video base
            move.b d2,$ffff8201.w
            move.b d1,$ffff8203.w
            move.b d0,$ffff820d.w

            ; pixel offset
            move.b boobs_hscroll_pixelOffset,$ffff8265.w
            ; line offset
            tst.b    boobs_hscroll_pixelOffset
            beq.s    boobs_hscroll_pxOffsetZero
            move.b    #76,$ffff820f.w
            bra.s    boobs_hscroll_afterPxOffset
boobs_hscroll_PxOffsetZero
            move.b    #80,$ffff820f.w
boobs_hscroll_afterPxOffset

            ; video counter
            move.b d2,$FFFF8205.w
            move.b d1,$FFFF8207.w
            move.b d0,$FFFF8209.w

            ; dodajemy
            add.b    #1,boobs_hscroll_pixelOffset
            cmp.b     #15,boobs_hscroll_pixelOffset
            ble.s    boobs_hscroll_notIncByteOffset
            add.l    #8,boobs_hscroll_byteOffset
            move.b  #0,boobs_hscroll_pixelOffset
boobs_hscroll_notIncByteOffset
            movem.l    (a7)+,d0-d2
            rts

Nie uzywałem tam nic więcej niz VBL i działało to ok. Chodzi o warunek ustawienia rejestru $ffff820f.w w zależności od ffff8265.

Maciek
--------
Atari 65XE + Ultimate 1MB + Stereo + SIO2SD | Atari 520STE + 4MB + UltraSatan | Atari Falcon 030 + CT60e + 14MB ST + 256MB TT + 68882  + CF + Netusbee | Amiga 500 + 1MB + Gotek | Amiga 600 + 2MB Chip + 8MB Fast + CF

3 Ostatnio edytowany przez Cyprian (2015-02-27 14:03:49)

obaj macie rację :)

w moim teście zmieniam $FFFF8265 po pierwszym HBLu a $FFFF820F modyfikuję o 8 bajtów ( -8 bajtów dla hscroll==0) i działa to ok

Petla_VBL
    STOP    #$2300 ; wait for 1st HBL
    move.w    #$2500,SR
    addq    #1,D2
    cmp.w    #576,D2
    blt.b    .skip
        moveq    #0,D2
.skip
    moveq    #0,D5
    move.l    D2,D3
    and.b    #$0F,D3
    move.b    D3,$FFFF8265.w
    bne.s     fix_line
        move.l    Adres_Ekranu,Licznik_Ekranu1
        move.b    #224-80,$FFFF820F.w     ; x-words
        move.l    D2,D3
        and.w    #$FFF0,D3
        lsr.l    #1,D3
        add.l    D3,Licznik_Ekranu1
        bra.s     scrn_poi
fix_line:
    move.b    #224-80-4,$FFFF820F.w
scrn_poi:
Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

4 Ostatnio edytowany przez mkm (2015-02-27 14:27:31)

Cyprian, nie mówię że można robić tego na hbl'u. Twierdzę, że NIE ma takiej potrzeby bo to było podejrzeniem Tomka - że jest to niezbędne. Kluczem jest uwzględnienie przesunięcia "-" o którym piszę i ja i Ty - wtedy można to zrobić wszędzie czy vbl (by scrolować cały ekran) czy hbl (choć niestabilość może poknocić trochę) czy timer b (by na przykład dzielić ekran i scrollować poziomo tylko część).

Maciek
--------
Atari 65XE + Ultimate 1MB + Stereo + SIO2SD | Atari 520STE + 4MB + UltraSatan | Atari Falcon 030 + CT60e + 14MB ST + 256MB TT + 68882  + CF + Netusbee | Amiga 500 + 1MB + Gotek | Amiga 600 + 2MB Chip + 8MB Fast + CF

5 Ostatnio edytowany przez Cyprian (2015-02-27 14:34:29)

Maciek, gdy z kodu usunę "    STOP    #$2300 ; wait for 1st HBL" przesuwanie ekranu traci stabilność - co jakiś czas ekran skacze. Czyli w moim przypadku zmiana $FFFF8265 od razu w VBLu nie działa prawidłowo.
W wolnej chwili mogę sprawdzić czy ze zmianą $FFFF8265 trzeba czekać do HBLa (512 cykli) czy można wcześniej jej dokonać

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

6

A to jest ciekawe. Bo ja tego nie robię i u mnie jest OK. Ciekaw jestem dlaczego?
Gdzieś czytałem - nie pamiętam gdzie, że aby hscroll dzialal poprawnie trzeba ustawiać rejestry w ścisłej kolejności: video counter registers, hardwarescroll registers, video base registers. Może to jest u Ciebie powodem?

Maciek
--------
Atari 65XE + Ultimate 1MB + Stereo + SIO2SD | Atari 520STE + 4MB + UltraSatan | Atari Falcon 030 + CT60e + 14MB ST + 256MB TT + 68882  + CF + Netusbee | Amiga 500 + 1MB + Gotek | Amiga 600 + 2MB Chip + 8MB Fast + CF

7 Ostatnio edytowany przez Cyprian (2015-02-27 14:47:29)

hmm, no może.
Z tym że o tym HBLu czytałem w jakiejś dokumentacji.

a oto dalszy ciąg kodu:

scrn_poi:
    REPT    2
        nop
    ENDR

    lea        Licznik_Ekranu1+1,A0            ; ustaw nowy adres ekranu
    move.b    (A0)+,$FFFF8205.w
    move.b    (A0)+,$FFFF8207.w
    move.b    (A0)+,$FFFF8209.w
Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

8

No właśnie ja czytałem o tym wałku z hbl i że ustawienie rejestrów w odpowiedniej kolejności go niweluje - o ile dobrze pamiętam. PS. nie wiem czy nie zamieniłem nazw rejestrów w poście, ważne by było tak jak u mnie kodzie. Jak będzie miał czas to sprawdź - ja do niedzieli nie będę miał możliowści więc się nie dowiem;)

Maciek
--------
Atari 65XE + Ultimate 1MB + Stereo + SIO2SD | Atari 520STE + 4MB + UltraSatan | Atari Falcon 030 + CT60e + 14MB ST + 256MB TT + 68882  + CF + Netusbee | Amiga 500 + 1MB + Gotek | Amiga 600 + 2MB Chip + 8MB Fast + CF

9

ok.
W necie krąży sporo mitów dot. hardware i kodowania, może to być jeden z nich.

tak na szybko widzę że ustawiasz i Video Base oraz Video Counter. Ja tylko modyfikuję Video Counter.

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

10

Właśnie. To pewnie powoduje różnice.

Maciek
--------
Atari 65XE + Ultimate 1MB + Stereo + SIO2SD | Atari 520STE + 4MB + UltraSatan | Atari Falcon 030 + CT60e + 14MB ST + 256MB TT + 68882  + CF + Netusbee | Amiga 500 + 1MB + Gotek | Amiga 600 + 2MB Chip + 8MB Fast + CF

OK. Widzę, że temat się rozwinął :D Po dwóch dniach rozgryzłem to już dosyć mocno, więc podzielę się obserwacjami :) Po pierwsze: ustawienie video base'a ma miejsce przy następnym VBL, video counter wprowadza zmiany natychmiast. Przy podwójnym buforze (jeśli się go wykorzystuję - ja tak robię), w grę wchodzi tylko Video Base. I teraz: zmiana $ff8265 z wartości niezerowej na zerową powoduje mignięcia, ponieważ zmiany wprowadzane są NATYCHMIAST, a nie przy kolejnym VBL. Więc jeśli zmieniacie to w vbl, będziecie mieć mignięcie, chyba że korzystacie z rejestrów video countera - ale to rozwali wam podwójny bufor. Rozwiązaniem jest zmiana tego rejestru PO wyświetleniu ekranu. Można do tego zastosować albo HBL i zliczyć sobie, kiedy skończy się wyświetlanie ekranu, albo zastosować timer b i też poczekać na koniec wyświetlania. Ja wybrałem timer, rejestr zmieniam w odpowiednim momencie i nie mam migotania :) Spróbujcie zrobić hscrolla na video base i z pixel shiftem, to zobaczycie, o co mi chodzi. :)

12

Tomek: Sorki za obsuwkę z grafą. Nagły atak spaw... znaczy się klientów. Jutro ślę na maila potrzebne pixelki.

bzzzz...bzzzzz..... o wgrało się !!!!
Hospes napisał/a:

Tomek: Sorki za obsuwkę z grafą. Nagły atak spaw... znaczy się klientów. Jutro ślę na maila potrzebne pixelki.

Ok, spoko.. hscroll hula już w dwie strony, ma kupę kolorów i tylko grafy brakuje. :P

14

Cyprian napisał/a:

ok.
W necie krąży sporo mitów dot. hardware i kodowania, może to być jeden z nich.

tak na szybko widzę że ustawiasz i Video Base oraz Video Counter. Ja tylko modyfikuję Video Counter.

Ok, znalazłem to źródło o którym pisałem: http://alive.atari.org/alive12/ste_hwsc.php
Tu jest opisany ten trick nie wymagający czekania na hbl - tak jak pisałem wymaga ustawienia i base i counter w odpowiedniej kolejności. Paranoid/PDX to solidna firma więc mit to nie jest - poza tym u mnie działa:)

@Wachu a widzisz, ja nie łączyłem horizontal scrollingu z buforowaniem, więc nie mam doświadczeń co do takiej kombinacji. no, ale faktycznie z tego co piszesz to musiałeś się solidnie napracować by to pogodzić;) z buforowniem łączyłem tylko hardware vertical scorlling i tam nie było problemów... no ale jest to bardziej prosty mechanizm.

Maciek
--------
Atari 65XE + Ultimate 1MB + Stereo + SIO2SD | Atari 520STE + 4MB + UltraSatan | Atari Falcon 030 + CT60e + 14MB ST + 256MB TT + 68882  + CF + Netusbee | Amiga 500 + 1MB + Gotek | Amiga 600 + 2MB Chip + 8MB Fast + CF

Dzięki za linka. :) Kurcze, u mnie z video counterem, to nawet base'a nie muszę ustawiać - zresztą pisał to też Cyprian. Muszę w takim razie jeszcze raz spojrzeć na coutera, bo może niepotrzebnie spinałem się z timerem - chociaż i tak go wykorzystuje, żeby sobie kilka palet kolorów na ekranie wyświetlać. :D Z tego, co się orientuję, to countera używa się do split screenów, tam trzeba wyświetlany adres zmieniać natychmiast. I ta świadomość natychmiastowości podmiany nie do końca mi przy podwójnym buforze pasuje ;) co nie oznacza, że jest błędna.