1

Na Grzybsoniadzie mówiłem, ze w noc przed wyjazdem stwierdziłem z niejakim zdziwieniem, ze najnowsza, praktycznie skończona wersja gry Line Runner pracuje niepoprawnie na real Atari, choc na Atari800Win 4 oraz na Altirze 1.9 chodzi bezbłędnie.
Objawy były takie ze grafika menu wyświetla sie nieprawnie (niektore linie sa w innym trybie, pol ekranu mruga), a po odpaleniu rozgrywki, gra natychmiast sie wiesza.

Dzisiaj zrobilem pare testow i znalazlem źródło problemów: gra sie krzaczy jeśli zmieniam przesów poziomy (robię sta HSCROL) w przerwaniach linii.

Po prostu potrzebuję miec różne przesuniecie w różnych liniach. Jak pisalem: oba "wiodące emulatory" to obsluguja poprawnie, a prawdziwe Atari 65XE nie.
Będe wdzieczny za wyjasnienie problemu.

Jesli nie da sie tego jakos obejsc to jestem w czarnej d... i bede musial wylaczyc scroll tła w grze :(

2 Ostatnio edytowany przez qbahusak (2012-05-12 16:39:46)

A sprawdzałeś na innym sprzęcie? Ja tu nie widzę powodu do niedziałania, skoro na emulatorze działa. Może antic Ci padł?

3 Ostatnio edytowany przez seban (2012-05-12 17:42:41)

Hej!

To błąd/niedokładność wszystkich emulatorów. Nie emulują poprawnie błędu ANTIC-a który jest bardzo wrażliwy na zmiany HSCROLL. HSCROLL można modyfikować w bardzo niewielkim "oknie czasowym" od wystąpienia przerwania, potem dzieją się dziwne rzeczy.

Nie chce teraz tutaj za bardzo dywagować ani zgadywać ale o ile mnie pamięć nie myli to zapis do HSCROLL wykonaj jak najszybciej po wystąpieniu przerwania, zaraz po sta $d40a, czyli np.

dli sta    reg_A

    lda    h_scr
    sta    $d40a
    sta    HSCROLL
    
    lda    reg_A
    rti

powinno pomóc. Sprawdź proszę i daj znać czy pomogło. Nigdy w to nie wnikałem ale pamiętam iż tak było. Jeżeli DLI jest dłuższe to resztę kodu wykonuj już po modyfikacji HSCROLL.

Electron potwierdził realnymi testami że modyfikacje HSCROLL (np. w środku linii) mogą wyprowadzić ANTIC z równowagi i ten potrafi wystawić HALT dla CPU w całej linii ekranowej do kompletu generując dziwaczne śmieci na ekranie. Widać było to dokładnie w w logach z ANTIC-a które wygenerował Electron, a potem Candle napisał program do wizualizacji tychże. Na tym forum kilka razy już przewijały się linki do tego programu.

pozdrawiam
Seban

ps) myślę iż gdyby wniknąć w ten problem i przyczynę jego powstawania może mogłoby wyjść z tego coś ciekawego ;-) Skoro GTIA "świruje" przy zmianie trybu w środku linii i da się przy pomocy tego zrobić 3 tryby graficzne w jednej linii to może i coś by się udało zrobić ciekawego po głębszym przeanalizowaniu problemu z ANTIC-em.

4 Ostatnio edytowany przez nosty (2012-05-12 23:17:55)

Sprawdzalem na razie na 2 Atari z serii XE.

Seban - dzieki. Po raz kolejny okazuje sie, ze w programowaniu Atari cos co wydaje sie jasne ma adnotacje "malym drukiem"... Tzn nie ma, bo nie znalazlem wzmianki o tym bugu nigdzie :P

Probowalem zrobic jak piszesz, a nawet probowalem robic zapis do HSCROL przed sta $d40a, bo pomyslalem ze skoro w linii po ktorej wywolywane jest przerwanie nie ma wlaczonego scrolla to czemu nie. Czyli tak:

dli sta    reg_A

    lda    h_scr
    sta    HSCROL

    sta    $d40a
    
    lda    reg_A
    rti

W obu przypadkach bez zmian - zwis natychmiastowy :(

Jestem troche podlamany, bo na tym "tricku" opieral sie scroll w grze. Sprobuje przeniesc ten zapis do HSCROL do petli glownej, w przerwaniach ustawiajac tylko flagi. Moze sie udac bo na szczescie linie w ktorych jest rozny scroll są oddzielone co najmniej jedną nieruchomą linią. Ale bedzie ciezko, bo w srodku ramki jeszcze gram muzykę :/

W kazdym razie dzieki za wyjasnienia.

EDITED: Wykasowalem zbyt wczesnie i pohopnie wyciagnięte wnioski ;)

5 Ostatnio edytowany przez xxl (2012-05-12 19:40:46)

moze tak?

dli sta    reg_A

    lda    h_scr
    sta WSYNC
    sta    HSCROL
    
    lda    reg_A
    rti

---
zamiast sta wsync lepsze chyba bedzie inc wsync

http://atari.pl/hsc/ad.php?i=1.

6

Przeniesienie do petli glownej sie nie udalo bo akurat tam gdzie powinienem zmieniac wartosc HSCROL  musze odtwarzac muzyke. Niezamierzenie uzyskalem wiec uroczy efekt kiedy elementy grafiki drgają w takt muzyki ;)

XXL - ale to jest dokladnie to co proponowal Seban i co też testowalem! Przeciez WSYNC = $D40A.
Nie dziala.
BTW czemu inc WSYNC jest lepsze? przeciez zajmuje 6 taktów a sta tylko 4.

7

widzisz... czytalem tylko Twoj ostatniu post a i to niedokladnie :-)

mail.

http://atari.pl/hsc/ad.php?i=1.

8 Ostatnio edytowany przez seban (2012-05-12 21:16:28)

Hej!

nosty napisał/a:

Czyli trzeba jasno powiedziec ze zapis do HSCROL w przerwaniu DLI jest niedozwolony bo moze powodowac zwis na niektorych Atari

To nie tak... jak najbardziej jest dozwolony. Ja się z tym borykałem od samego początku zabawy z HSCROLL. Na 1000% da się zrobić to do czego dążysz. Popatrzę w jakieś swoje stare źródła i spróbuje sobie przypomnieć co było problemem. Zawsze h-scollowałem na DLI, tylko musiałem pilnować momentu zapisu do HSCROLL.

Zwis jest powodowany tylko tym iż ANTIC świruje, być może wyświetla śmiecie, genruje ci masę następnych DLI. Kiedyś nie mogłem załapać co się dzieje ale miałem DLI typu:

pha
txa
pha
tya
pha

...
...
...

pla
tay
pla
tax
pla
rti

Po wywołaniu paru niefortunnych wpisów do HSCROLL ze zdziwieniem obserwowałem jak na stosie jest odkładana kupa śmieci. Okazało się iż wywołana została cała masa przerwań DLI kóra teoretycznie nie istniała.

Jeszcze jedno, podczas pisania Overmind okazało się iż ANTIC ma błąd związany z DLI polegający na tym iż jeżeli w ostatnim rozkazie Display List [ dta $41,a(dl) ] ustawisz bit DLI, czyli zamiast $41, zrobisz $C1 to DLI-NMI będzie generowane przez ANTIC już do końca ekranu :) mimo iż jest tam zupełna pustka. To tak przy okazji, ale chyba u Ciebie ten problem nie występuje. To co opisujesz to typowy problem z zapisem do HSCROLL.

9

XXL mi wlasnie napisal ze on tez stosuje zapis do HSCROL w DLI i u niego dziala.
Wiec zrobie jeszcze pare testow. Moj DL jest dosc rozbudowany i pomyslalem ze błąd moze zalezec od tego czy w linii w ktorej jest wywolywane DLI ze zmiana HSCROL (lub w następnej) laduje adres pamieci ekranu (+$40) i ustawiam scroll (+$10).
Napisze jak cos osiągnę.

10

> Jeszcze jedno, podczas pisania Overmind okazało się iż ANTIC ma błąd związany z DLI polegający na tym iż jeżeli w ostatnim rozkazie Display List [ dta $41,a(dl) ] ustawisz bit DLI, czyli zamiast $41, zrobisz $C1 to DLI-NMI będzie generowane przez ANTIC już do końca ekranu  mimo iż jest tam zupełna pustka.

to jest ciekawe, moze po rozkazie jvb nie jest zwiekszany licznik programu antica i wykonuje on caly czas ostatnia instrukcje do wystapienia przerwania wygaszania pionowego?

http://atari.pl/hsc/ad.php?i=1.

11

A ja stawiam na coś prozaicznego.
Przerwania DLI stackują Ci się /nakładają :) Są za długie - wyczerpujesz cały czas procka i jeszcze jeden
Na 100% masz błąd i na 100% nie jest to błąd hardwareowy.

Opisz problem:
1. jak często wykonujesz przerwanie DLI (powyższe przerwanie nie może być wykonane częściej niż raz na dwie linie grafiki)
2. jaki tryb graficzny/znakowy
3. jaka szerokość ekranu
4. ile linii ono trwa
5. inne ważne rzeczy.

I nie wyciągaj wniosków z palca :)

W ATARI NIE MOŻNA STOSOWAĆ KOMEND: cli;  jmp * , bo powoduje to zwis systemu!

12 Ostatnio edytowany przez nosty (2012-05-13 00:08:43)

Udało mi się usunąć problem i zmieniam HSCROL na przerwaniach bez zwisu :)
Zła wiadomosc jest taka, ze mimo przeprowadzenia 23 testów wciąż nie wiem jednoznacznie co było przyczyną problemu.

XXL zasugerował ze moze to byc miejsce w pamieci gdzie są procedury przerwan. Jakub sugeruje zbyt długie albo zle skonstruowane przerwania. Seban - problem Antica z obsluga zapisu do HSCROL w przerwaniach.
A mi wychodzi z testów ze to musi byc splot kilku z tych czynnikow, a do tego jeszcze jeden najważniejszy: konstrukcja DL (tryb, zmiany trybow, przerwania, scrolle).

Krótko: problem ustąpił kiedy dodalem dodatkowe przerwania linii specjalnie do wykonania w nich zmiany HSCROL, oraz usunąłem w DL z linii w której wywołuję przerwanie znacznika scrolla poziomego ($10).
Akurat moglem sobie pozwolic na te zmiany. I muszą byc obie zeby nie bylo smieci na real Atari.

A teraz wyjasniam, czemu pisalem, ze dalej nie wiem co bylo przyczyną.
Używam trybów tekstowych (mieszanka $02 i $04).
Mam kilka przerwań linii. Kazda linia ma swoja procedurę do obsługi. Wewnątrz procedury przerwania nastepuje przekierowanie wektora VDSLST na kolejną procedurę i tak w kółko. Nie są długie. Najdłuższa wyglądała mniej więcej tak:

dli_3
   php
   sta dli_uni2
   lda HSCROL_2
   sta WSYNC       ;wait__line
   sta HSCROL
   lda #KOL_1_tlo
   sta COLPF1
   lda #KOL_2
   sta COLPF2
   lda #>dli_1
   sta VDSLST+1
   lda #<dli_1
   sta VDSLST
   lda dli_uni2
   plp
   rti

W mojej grze muszę 2x zmienić HSCROL w czasie rysowania obrazu.
Jak powiedzialem dodalem dwa specjalne przerwania linii tylko dla tych zmian.

I z ostatniego testu wyszło mi coś dziwnego.
Jeśli fragment DL wygląda tak, to program działa poprawnie:

         dta $44+$10, a(pamiec_ekranu+40+88*3)
         dta $44+$80,a(pamiec_ekranu+40+88*4)  ;na tym przerwaniu jest tylko zapis do HSCROL
         dta $44+$10,a(pamiec_ekranu+40+88*5)

a jesli ten fragment wygląda tak, to juz grafika na ekranie się chrzani dokumentnie:

         dta $44+$10, a(pamiec_ekranu+40+88*3)
         dta $44+$10+$80,a(pamiec_ekranu+40+88*4)  ;na tym przerwaniu jest wylacznie zapis do HSCROL
         dta $44+$10,a(pamiec_ekranu+40+88*5)

Czyli jedyne co sie zmienilo to to czy w linii w ktorej jest przerwanie jest włączony scroll czy nie. Nie zmieniły sie ani procedury przerwań, ani ich położenie w pamięci, nic kompletnie oprocz jednego bitu :)

Ta procedura przerwania wywolywana w tej linii wyglada tak:

dli_11
   php
   sta dli_uni2
   lda HSCROL_1
   ;wait__line
   sta WSYNC  
   sta HSCROL
   mwa #dli_2 VDSLST
   lda dli_uni2
   plp
   rti

Trudno o cos prostszego.

A czemu napisalem ze to dziwne i niejednoznaczne? Bo drugie miejsce w DL gdzie zmieniam na przerwaniach HSCROL wygląda tak:

         dta $02+$10+$40+$80, dta a(linia_3)   ;na tym przerwaniu jest tylko zapis do HSCROL
         dta $42+$10+$80,a(pamiec_ekranu+40+88*8)  ;a na tym tylko zmiana 2 kolorow

I w tym wypadku zadne zmiany nie byly potrzebne! Ten kawałek działa niezaleznie czy w pierwszej linii jest włączony scroll (+$10) czy nie.

I dlatego wlasnie dalej nie wiem od czego dokladnie zalezy ze moj program na real Atari dziala :P

13

php, plp jest niepotrzebne

http://atari.pl/hsc/ad.php?i=1.

14 Ostatnio edytowany przez nosty (2012-05-13 00:31:31)

A fakt, dzieki.
Zawsze to parę cennych taktow.

15

jak wyglada DLista (pod emulatorem dlist)

http://atari.pl/hsc/ad.php?i=1.

16 Ostatnio edytowany przez nosty (2012-05-13 01:42:21)

Teraz (kiedy juz dziala) tak:

> dlist
6D10: 8 BLANK
6D11: 8 BLANK
6D12: 8 BLANK
6D13: DLI LMS 5700 MODE 2
6D16: LMS 5728 HSCROL MODE 4
6D19: LMS 5787 HSCROL MODE 4
6D1C: LMS 57df HSCROL MODE 4
6D1F: LMS 5837 HSCROL MODE 4
6D22: DLI LMS 5888 MODE 4
6D25: LMS 58e0 MODE 4
6D28: LMS 5938 MODE 4
6D2B: DLI LMS 5990 MODE 4
6D2E: LMS 603c HSCROL MODE 2
6D31: LMS 643c HSCROL MODE 2
6D34: DLI LMS 683c HSCROL MODE 2
6D37: DLI LMS 59e8 MODE 2
6D3A: LMS 5a17 HSCROL MODE 4
6D3D: LMS 5a6f HSCROL MODE 4
6D40: LMS 5ac7 HSCROL MODE 4
6D43: LMS 5b1f HSCROL MODE 4
6D46: LMS 5b77 HSCROL MODE 4
6D49: LMS 5bcf HSCROL MODE 4
6D4C: LMS 5c27 HSCROL MODE 4
6D4F: LMS 5c7f HSCROL MODE 4
6D52: LMS 5cd7 HSCROL MODE 4
6D55: LMS 5d2f HSCROL MODE 4
6D58: LMS 5d87 HSCROL MODE 4
6D5B: JVB 6d10
>

XXL, wysle Ci jutro caly kod z opisem. Widze ze sie zawziales :)
Moze wyjasnisz te zagadke z pozytkiem dla mnie i moze innych probujacych sie z asm.

17

Jeżeli po zmianie jednego z bajtów składowych wektora DLI zostanie zgłoszone kolejne przerwanie DLI, to wtenczas wektor będzie zazwyczaj wskazywał niepoprawną wartość, nastąpi skok w ogórki. Sprawdź, czy przeniesienie ustawiania wektora na sam początek przerwania DLI zmienia sytuację. Wątpię, aby w Twoim konkretnym przypadku to było źródłem problemu, aczkolwiek bezpieczniej jest zmieniać ten wektor na początku przerwania.

18

ja stawiam na to co pisal Kuba, tj. zbyt dluga procedura obslugi przerwania, na co pomoglo rozbicie jej na osobne czesci, wywolywane przez osobne dli.

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

19

Przeciez w poscie nr 12 zamiescilem swoją najdłuższą procedure obslugi DLI. No policzcie sami takty "jesli nie wierzycie milicji" :P Biorąc pod uwage ze mam linie tekstowe, a kolejne przerwanie jest 3 linie dalej, to procka musialaby trwac naprawde bardzo dlugo...

Ja caly czas obstawiam ze pomoglo nie tyle rozbicie DLI na mniejsze czesci co przesuniecie zmiany HSCROL'a w inne miejsce Display List. Jak widzicie DL jest dość "bogaty" więc naprawdę doszukiwałbym sie raczej splotu tej zmiany (problemów o jakich pisal Seban) z trybem graficznym / ustawieniem scrolla / ladowania adresu, w danej linii DL lub linii nastepnej.

Jak troche doprowadze do porządku kod to wysle do XXL'a. Mysle ze on to rozwikla i da ostateczną odpowiedz.

20

nie potrzebuje zrodel programu, wystarczy program do uruchomienia (.xex)

http://atari.pl/hsc/ad.php?i=1.

21

xxl napisał/a:

nie potrzebuje zrodel programu, wystarczy program do uruchomienia (.xex)

hehehe "prawdziwy programista czyta program w postaci kodow hex" :)

Za pozno przeczytalem, przed chwila dostales wszystko na maila.

22

nosty: to przynajmniej przepusc mu to przez rot13 ;)

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

23 Ostatnio edytowany przez nosty (2012-05-13 21:13:50)

W filmie "Szabla od komendanta" jeden z bohaterów sam sobie zagłuszał Woną Europę przy pomocy bodajze kury, bo jak mowil tak sie przyzwyczail za komuny do zagłuszania ze bez niego juz nic nie rozumie :)
Moze XXL ma juz podobnie od tych wszystkich portów - w xexach czyta jak Neo w matrixie ;)

24

srutututu. chcialem isc na latwizne, dostalbym gotowca i nie musialbym kompilowac.

dzis wieczorem bede mial dostem do sprzetu przetestuje.

http://atari.pl/hsc/ad.php?i=1.

25

Przestawianie HSCROLa w środku linii z HSCROL może powodować śmieci - również w następnych liniach. Atari800 tego nie emuluje, Altirra chyba dopiero od wersji 2.0. Są ciekawe, niedawno odkryte zastosowania tego: http://www.atariage.com/forums/topic/17 … p__2176879
Nic mi natomiast nie wiadomo o tym, aby miało to wpływ na przerwania lub zawieszanie.

DLI w rozkazie zakończenia DL będzie się wywoływał co linię. Atari800 emuluje to od jakichś dziesięciu lat.

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