Otwieram wątek, który może okazać się przydatny dla początkujących i średniozaawansowanych koderów. Nad pewnymi rzeczami dość długo się męczyłem to może to pozwoli komuś innemu zaoszczędzić czas. Być może ktoś z większym doświadczeniem wzbogaci te obserwacje o wyjaśnienia.
- na prawdziwym Atari problemem jest, jeżeli ostatnią linię scanline w DL ustawimy jako $0F (hires). Rzecz ta działaj bez problemu na emulatorach.
- Nie można dowolnie zmieniać rejestru HSCROLL na DLI. Z moich obserwacji wynika, że zmiana o 1 działa wszędzie, o np. 3 już niestety tylko na emulatorach.
Ad.1. Tryb 2 i 3 również. Generalnie chodzi o tryby hiresowe.
Ad.2. A to czemu? Z moich obserwacji wiem, że problemy powoduje lms+tryb tekstowy+hscroll+vscroll + szeroki ekran, bo sporo rzeczy ANTIC musi pobrać i w pierwszej linii trybu znakowego potrafią pokazać się śmieci. Skrol polega na odpowiednio wcześniejszym przepisaniu wartości obrazu do rejestru przesuwnego wyrzucającego dane na ekran. Jeśli przesuw o większą ilość cykli byłby problemem, to nie dałoby się statycznie ustawiać przesunięcia w tekstowych trybach szerokich (GR.1, GR.2), a to jednak raczej działa. Miałbyś gdzieś może jakiś przykład? Ciekawi mnie w jakich okolicznościach taki bug może występować.
Ad. 2. Na DLI można dowolnie zmieniać HSCROLL, pod warunkiem że robimy to poza obszarem DMA obrazu lub w skanlinii bez poziomego przesuwu. Wytłumaczenie, co się dzieje w przeciwnym przypadku wymaga wyjaśnienia całego mechanizmu DMA Antica, jest to chyba w Altirra Hardware Reference Manual.
Dziękuję za naprostowanie. Z mojej perspektywy konstrukcje rodzaju:
lda $d20a and #1 sta hscroll sta $d40a - działają bez problemu
.. lda $d20a and #3 ; na przykład sta hscroll sta $d40a - działają na emu, nie działają na rela HW (krzaki)
doczytam sobie zatem jeszcze w ARM. Zmiany robiłem w liniach które mają ustawiony hscroll. Np. w intrze press play on tape na greetingsach zmiana jest co jeden (desynchronizacja napisu). Zmiana co n była "ładniejsza" ale nie działała poprawnie na Atari.
To co mi nie działało to zmiana hscroll co linię (w liniach który miały ustawiony bit HS). Nie wiem czy to jest kwestia szybkiego zapisu, czy zapisu w odpowiednim momencie. Wydaje mi się, że próbowałem sugerowanych kombinacji - właśnie na SV (także zapisu do WSYNC przed manipulacją na HSCROLL i taką kombinację jak podał XXL)
Byłem zmęczony, ale ktoś twierdził, że to bug Antica. Nie rozumiem na razie dlaczego co 1 działa, co 3 nie. Muszę doczytać trochę w Manualu i jeszcze poeksperymentować.
Dla mnie podpowiedzi są cenne i nie jest to prosto zapewnić - także dziękuję :)
xxl: jak pisałem w poscie 3, problem jest gdy zmieniamy HSCROL na obszarze DMA obrazu. WSYNC przenosi nas na prawa ramke obrazu normalnego, w przypadku HSCROL ANTIC jeszcze pobiera tam dane obrazu.
xeen: najmłodszy bit HSCROL steruje tylko linią opozniajaca o cykl koloru. Dlatego działa nawet w połowie linii (swoją drogą nie słyszałem, by ktoś tego użył?). Pozostałe bity regulują dzielnik DMA i jeśli są różne wartości HSCROL na początku i na końcu linii, dzielnik DMA "psuje się" i zaczyna generowac więcej DMA, niż oczekujemy w danym trybie.