atarionline.pl Assembler - mini prosty programik - pytanko zagwostka - 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.  
    Hejka,

    Bardzo prosty programik w asemblerze:
    DMACTLS = $22F  ; DMA

    COLBK = $D01A ; kolor tla
    VCOUNT = $D40B

    LDA #0
    STA DMACTLS

    petla LDA VCOUNT
    STA COLBK
    JMP petla

    Program daje idealną tęczę, czyli każda linia jest w innym kolorze (dokładniej w kolorze o numerze równym jej numerowi).

    Proste. Niezbyt eleganckie, bo prosiłoby się użyć przerwań. Natomiast skuteczne.

    To co zastanowiło mnie w tym programie, to jedna rzecz. Otóż skoro pętla idzie w nieskończoność i nie używa przerwań, spodziewałbym się, że boki tęczy mogą być leciutko postrzępione. Nie wszystkie, ale losowo wybrane. Znaczy LDA VCOUNT ładuje numer wyświetlanego wiersza ekranu. I teraz wyobrażam sobie, że czasem zanim program przejdzie do części STA COLBK może wystąpić przejście do kolejnego wiersza przy generowaniu obrazu (bo w końcu cały czas "napierdzielają" przerwania i cały czas generowany jest obraz przez ANTIC i GTIA) i wtedy na początku tego kolejnego wiersza załapie się jeszcze kolor z poprzedniego. Tymczasem tak się nie dzieje i tęcza jest idealna (to znaczy każda pozioma linia jest w jednym kolorze, nie ma jakiś krótkich kreseczek na początku o kolorze z poprzedniej linii). Dlaczego?

    Mam dwie teorie.
    1. Tak naprawdę generowany obraz jest szerszy niż ten rzeczywiście widoczny. Czyli cóż z tego, że przez powiedzmy 1% kolejnej linii mamy zły kolor, jak tego jeszcze nie widać, bo w praktyce na ekranie wyświetla się jedynie np. 95%, a znów ta pętla LDA/STA jest bardzo krótka, w praktyce 6 bajtów, bo JMP już nie ma znaczenia czy wykona się w bieżącej, czy kolejnej linii.
    2. O ile dobrze pamiętam, bo to wiedza sprzed lat, na czas w momencie kiedy ANTIC potrzebuje danych z pamięci do generowania obrazu, zatrzymuje fizycznie procesor generując przerwanie sprzętowe z użyciem lini HALT. Zastanawiam się, czy to jakoś nie ma wpływu na to, że te linie nie wychodzą postrzępione po brzegach czasami.

    Jest tu ktoś kto rozwikła zagadkę. ;P
    • 2: CommentAuthorrobert
    • CommentTime15 Dec 2020 zmieniony
     
    ->link<-
    Chyba jest tak, że DMA wyłączone, więc ANTIC nie przerywa bo nie pobiera danych.
    • 3: CommentAuthortebe
    • CommentTime15 Dec 2020
     
    cała wiedza jest na wyciągnięcie ręki, wyobraźnia jej nie zastąpi
    • 4:
       
      CommentAuthorshanti77
    • CommentTime15 Dec 2020
     
    Poczytaj sobie ->link<-
    • 5: CommentAuthorastrofor
    • CommentTime15 Dec 2020 zmieniony
     
    • 6: CommentAuthormono
    • CommentTime15 Dec 2020 zmieniony
     

    itguyinaction:

    1. Tak naprawdę generowany obraz jest szerszy niż ten rzeczywiście widoczny. Czyli cóż z tego, że przez powiedzmy 1% kolejnej linii mamy zły kolor, jak tego jeszcze nie widać, bo w praktyce na ekranie wyświetla się jedynie np. 95%, a znów ta pętla LDA/STA jest bardzo krótka, w praktyce 6 bajtów, bo JMP już nie ma znaczenia czy wykona się w bieżącej, czy kolejnej linii.

    I tak właśnie jest. Zmiana VCOUNT odbywa się w 110 cyklu a cykli w linii jest 114 więc STA nie zdąży zapisać nowego koloru w tej samej linii - lewa strona ekranu będzie postrzępiona, ale zdaje się obraz widoczny na ekranie zaczyna się około $20 cyklu.

    Edit: ORTOGRAF! Dwójeczka :)
  2.  
    @robert, nie zwróciłem uwagi, że 00 to wyłączenie ANTIC'a, tak z pamięci wydawało mi się, że to jakiś tryb wyświetlania, a nie wyłączenie. Cóż... Ale dzięki za podpowiedź.

    @shanti77, prawie 400 stron lektury, hmm... to chyba na długie zimowe wieczory, jak już będę na emeryturze i nie będę miał zupełnie co robic. :P Choć lektura pewnie fajna. :D

    @mono, i to jest odpowiedź na wagę złota, na którą czekałem. Zresztą potwierdza moje przypuszczenia. Dzięki ogromne. :)

    Swoją drogą ciekawe, jak takim prostym programem można pokazać tak wiele, jak działa małe Atari od wewnątrz. :)
  3.  
    Dzięki mono, dobrze wiedzieć :)
    • 9:
       
      CommentAuthorshanti77
    • CommentTime16 Dec 2020
     
    @itguyinaction a kto ci kazał czytać całą książkę? W spisie treści masz rozdział 4.10 VCOUNT.
  4.  
    @shanti77, uff, to poczytam w wolnej chwili. :)

    Swoją drogą, czy dobrze rozumiem, że cały ten efekt jest uzyskiwany tylko dzięki temu, jak pracuje GTIA (ANTIC w tym przypadku sobie odpoczywa)?
    • 11: CommentAuthorbob_er
    • CommentTime17 Dec 2020
     
    ANTIC może nie tyle odpoczywa, co na pół gwizdka pracuje. Wszak to on zmienia wartość VCOUNT.
    Ale tak - polega to na tym, że zmieniasz zawartość rejestrów GTIA, i te zmiany mają efekt natychmiastowy.
  5.  
    Jeszcze jedna rzecz mnie zastanawia. Czemu ten licznik nazywa się Vertical line counter? Przecież on liczy linie obrazu, a nie kolumny i zwiększa się co drugi sygnał przerwania synchronizacji poziomej...
    • 13: CommentAuthorbob_er
    • CommentTime18 Dec 2020
     
    Liczy obiekty (linie) poukładane pionowo - jedna nad drugą.
    Więc określenie 'VERTICAL' mi tu pasuje.
    • 14:
       
      CommentAuthorIRATA4
    • CommentTime28 Dec 2020
     
    ej ! nie propagować mi tu krzywych ideologii ;),biało czerwonej planszy z orłem w koronie albo kotwicą nie idzie zakodować ? ;)

    Fajnie że wrzucacie takie rzeczy,dziś będę eksperymentował .
    • 15:
       
      CommentAuthorKaz
    • CommentTime28 Dec 2020
     
    Irata - i jak wyszedł eksperyment? Zacząłeś kodować w asmie? :)
    • 16:
       
      CommentAuthorIRATA4
    • CommentTime29 Dec 2020
     
    Nie od wczoraj.