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: CommentAuthoritguyinaction
      • CommentTime15 Dec 2020 20:12 zmieniony
       
      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 21:12 zmieniony
       
      ->link<-
      Chyba jest tak, że DMA wyłączone, więc ANTIC nie przerywa bo nie pobiera danych.
      • 3: CommentAuthortebe
      • CommentTime15 Dec 2020 21:12
       
      cała wiedza jest na wyciągnięcie ręki, wyobraźnia jej nie zastąpi
      • 4:
         
        CommentAuthorshanti77
      • CommentTime15 Dec 2020 21:12
       
      Poczytaj sobie ->link<-
      • 5: CommentAuthorastrofor
      • CommentTime15 Dec 2020 21:12 zmieniony
       
      • 6: CommentAuthormono
      • CommentTime15 Dec 2020 21:12 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 :)
      • 7: CommentAuthoritguyinaction
      • CommentTime15 Dec 2020 22:12 zmieniony
       
      @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. :)
    1.  
      Dzięki mono, dobrze wiedzieć :)
      • 9:
         
        CommentAuthorshanti77
      • CommentTime16 Dec 2020 09:12
       
      @itguyinaction a kto ci kazał czytać całą książkę? W spisie treści masz rozdział 4.10 VCOUNT.
    2.  
      @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 21:12
       
      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.
    3.  
      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 14:12
       
      Liczy obiekty (linie) poukładane pionowo - jedna nad drugą.
      Więc określenie 'VERTICAL' mi tu pasuje.
      • 14:
         
        CommentAuthorCOR/ira4
      • CommentTime28 Dec 2020 09:12
       
      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 23:12
       
      Irata - i jak wyszedł eksperyment? Zacząłeś kodować w asmie? :)
      • 16:
         
        CommentAuthorCOR/ira4
      • CommentTime29 Dec 2020 00:12
       
      Nie od wczoraj.