1

W momencie, gdy włączam horizontal scroll w display liście, a HSCROL ustawiony jest na 0, dana linia trybu przesunięta jest o 16 color clocków w lewo względem tego co wyświetlane jest gdy horizontal scroll jest wyłączony. Przy każdym zwiększeniu HSCROLa o 1, linia przesuwana jest w prawo o 1 color clock. Przy maksymalnym ustawieniu, czyli HSCROL=15, pierwszy color clock linii jest "za" lewą krawędzią ekranu (linia jest wyświetlana począwszy od drugiego color clocka).

Jak standardowo rozwiązuje się ten problem? Do głowy przychodzą mi 2 rozwiązania:

1) ustawienie LMS na poprzedni bajt i niedopuszczenie wartości HSCROLa, które powodowałyby wyświetlenie danych sprzed początku pamięci ekranu
2) wyłaczenie horizontal scroll w DL

2 Ostatnio edytowany przez tebe (2016-10-21 16:51:34)

bierzesz pod uwagę to że dla włączonego HSCROL-a masz szerszy obraz? dla ekranu wąskiego (32 bajty) włączenie HSCROL spowoduje że wiersz ma już 40 bajtów szerokości

HSCROL zwyczajowo ustawiasz 0..3, potem zmiana adresu wiersza, można inaczej 3..6, można 0..15 tylko potem adres wiersza o 4 bajty zamiast 1

niskie wartości HSCROL zajmą mniej czasu, wyższe więcej, ale w normalnym użyciu jest to bez znaczenia

http://madteam.atari8.info/index.php?prod=fx#hscrol

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

3

Tak, biorę to pod uwagę. Z tego co piszesz, wychodziło by że stosuje się opcję nr 1. Jeśli dobrze rozumiem spowoduje to, że Antic będzie pobierał dane sprzed początku ekranu, jeżeli dojedziemy do lewej krawędzi obrazu. Biorąc pod uwagę to, że licznik pamięci ekranu w Anticu zawija się na granicy 4kB musimy umiescic poczatek ekranu nie na granicy 4k, ale nieco dalej (przynajmniej jeden bajt dalej, a jesli chcemy korzystać z wyższych wartości HSCROL, to kilka bajtów). Mam rację?

4 Ostatnio edytowany przez tebe (2016-10-22 08:51:28)

zależnie od kierunku scrolla, wartości 0-1-2-3, lub 3-2-1-0, najczęściej używa się stałego bufora na scroll, a nie przeznacza n-KB, przesuń poprzez rejestr HSCROL, a następnie przesuń zawartość bufora np. w lewo, na ostatniej zwolnionej pozycji dopisz nowy znak

można też przez ring-buffer, masz 256 bajtów jako bufor scrolla, ustawiasz wyświetlanie na początek takiego bufora, przesuwasz przez HSCROL o jeden znak, następnie zerujesz HSCROL + zwiększasz młodszy bajt adresu w DISPLAY LiST Antic-a, co spowoduje że napis przesunie się w lewo, teraz kończysz wstawiając nowy znak tylko że na pozycji X i pozycji X+40, gdzie X oznacza aktualna pozycję w buforze (40 oznacza szerokość wyświetlanego tekstu), taka organizacja jest najszybsza, nie wymaga przepisywania zawartości bufora

tutaj więcej przykładów http://codebase64.org/doku.php?id=base:demo_programming
z tym że najczęściej te przykłady odnoszą się do tej wersji z przepisywaniem znaków w buforze

stary wątek z przykładem efektywnego scrolla dla ring-buffer

http://www.atari.org.pl/forum/viewtopic … 38#p199838

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

5

Ile zyskamy zmieniając scroll z wartości 12-15 na 0-3 dla przykładowo 28 linii ekranu w trybie znakowym (antic 4)? Po włączeniu HSCROLL'a myślałem, że linia ma zawsze 48 bajtów, czy jest to zależne od szerokości obrazu?

6

Jest to zależne od szerokości playfielda ustawionej w DMACTL:

1) Dla wąskiego playfielda (128 color clocków) po włączeniu hscrolla linia ma tyle co normalny playfield (160 color clocków).
2) Dla normalnego playfielda (160 color clocków) po włączeniu hscrolla linia ma tyle co szeroki playfield (192 color clocków).
3) Dla szerokiego playfielda (192 color clocków) po włączeniu hscrolla szerokość się nie zmienia.

Dla trybu antic 4 jest to odpowiednio 32, 40 i  48 bajtów.

7

Ok, a pierwsza część pytania? czytałem gdzieś na forum, że to właśnie 12-15 jest szybsze.

8 Ostatnio edytowany przez Fox (2016-10-26 12:48:06)

Oczywiście, że wyższe wartości HSCROL ograniczają liczbę cykli DMA w związku z czym więcej zostaje dla 6502. Tebe sieje dezinformację.

Dla 28 linii ANTIC 4 szerokości normalnej lub szerokiej zastąpienie 0-3 przez 12-15 daje oszczędność 756 cykli na ramkę - myślę, że warto.

Szczegóły: http://www.beipmu.com/Antic_Timings.txt
Na ten temat jest też mój artykuł "Dlaczego ANTIC jest miły dla 6502" w Syzygy 5, ale uprzedzam, że ma 18 lat i błędy.

Edit:
Co do szerokości linii przy HSCROLu i oszczędzania na DMA: przy szerokości normalnej i szerokiej DMA jest identyczne i linie mają 48 bajtów. Przy szerokości wąskiej z HSCROLem linie mają 40 bajtów, a liczba cykli DMA nie zależy od wartości HSCROL.

https://www.youtube.com/watch?v=jofNR_WkoCE

9

Ok, dzięki

10

:) w moim konkretnym przypadku wartości 6,7,8,9 sprawdzają się najlepiej, pozostałe zrywają synchronizację linii

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

11

Rybags for full-screen VSCROL technique and high HSCROL lighter DMA technique

http://www.atariage.com/forums/topic/15 … try1911485
http://www.atariage.com/forums/topic/19 … try2637036

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C