atarionline.pl DLI - newbe question - 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:
         
        CommentAuthorxeen
      • CommentTime15 Feb 2010 22:02
       
      Chciałbym zrobić prostą rzecz. zmodyfikować DL dla gr.15 (na przykład - dla uproszczenia nie chcę mieszać trybów) tak aby uzyskać różną paletę 4 kolorów w niektórych liniach (typowe dla wyjadaczy, dla raczkujących nie:)).
      Jeżeli dobrze zrozumiałem materiały:

      - muszę w interesującej mnie linii generującej grafikę ustawić najstarszy bit w programie ANTIC'a
      - przy generowaniu obrazu spowoduje to przerwanie i wywołanie procedury znajdującej się pod adresem w zapisanym w komórce $0200)
      - w procedurze muszę mieć jakiś warunek sprawdzający w której jestem linii (jak dobrze zrozumiałem - można to odczytać z komórki $D40B)) no i modyfikować rejestry kolorów - 702-708?

      no i tutaj brakuje mi wiedzy (uczę się dopiero) - czy ktoś mógłby mi podać jakiś jak najbardziej prosty przykładzik, który ustawi inne 4 kolory dla paru linijek, inne dla pozostałych linijek?

      tak żebym sobie lamersko skorzystał i może zrozumiał (komentarze dla laika w kodzie mile widziane)
      może jest jakaś standardowa praktyka, aby to było (w miarę optymalnie napisane)

      z góry dziękuję
      • 2: CommentAuthormono
      • CommentTime15 Feb 2010 22:02 zmieniony
       
      Najprościej:
      dli:
      sta zpg_areg
      stx zpg_xreg

      ldx VCOUNT
      lda colpf0_tab,x
      sta COLPF0
      lda colpf1_tab,x
      sta COLPF1
      ...

      lda zpg_areg
      ldx zpg_xreg
      rti
      ;komórki na stronie zerowej
      zpg_areg equ $fe
      zpg_xreg equ $ff

      Ale ponieważ VCOUNT liczy co drugą linię trzeba dla trybów jednoliniowych (jak GR.8, GR.15; dwuliniowy to np. GR.7), trzeba uciec się do pewnego tricku z określaniem którą linię (jedną z dwóch) dla konkretnego wskazania VCOUNT właśnie nam przerwanie złapało:
      dli:
      sta zpg_areg
      stx zpg_xreg

      ldx VCOUNT
      cpx zpg_old_vcount
      stx zpg_old_vcount
      beq DRUGA_LINIA
      PIERWSZA_LINIA:
      lda colpf0_tab_parzyste,x
      sta COLPF0
      lda colpf1_tab_parzyste,x
      sta COLPF1
      ...
      lda zpg_areg
      ldx zpg_xreg
      rti
      DRUGA_LINIA:
      lda colpf0_tab_nieparzyste,x
      sta COLPF0
      lda colpf1_tab_nieparzyste,x
      sta COLPF1
      ...
      lda zpg_areg
      ldx zpg_xreg
      rti

      Trick polega na zachowaniu wartości odczytanej z VCOUNT i porównaniu jej z aktualnie odczytaną na przerwaniu DLI.
      colpfx_tab* to tablice z wartościami kolorów dla poszczególnych linii wskazywanych przez VCOUNT.

      Edit: COLPFx to oczywiście rejestry hardwareowe ANTICa, a nie rejestry-cienie. Rejestry-cienie są przepisywane do rejestrów hardwareowych na przerwaniu VBLK a więc "poza ekranem" - ich zmiana na DLI nie da nic.

      Edit 2: BARDZO WAŻNA sprawa: długość dli NIE MOŻE przekraczać czasu trwania linii. Innymi słowy - ponieważ DLI jest przerwaniem niemaskowalnym, to jedno DLI może przerwać drugie co z takim sposobem zapisu rejestrów przy wejściu do przerwania spowoduje odtworzenie złych wartości i zamieszanie oraz skok w maliny. Można tego uniknąć bardziej czasochłonną metodą zapisywania/odzyskiwania wartości rejestrów procesora:
      dli:
      pha
      txa
      pha
      ...
      pla
      tax
      pla
      rti

      Wybierz co będzie Ci najlepiej odpowiadać. No i obowiązkowo licz cykle!
      • 3:
         
        CommentAuthorxeen
      • CommentTime15 Feb 2010 23:02
       
      dzięki wielkie
      dla Ciebie to może elementarz/podstawa, od mojej strony muszę to sobie spokojnie przeanalizować

      zaczynam asma właśnie od dli
      • 4: CommentAuthormono
      • CommentTime15 Feb 2010 23:02
       
      Żaden problem. Najlepszą wiedzę zdobywa się podczas eksperymentowania.
      Do liczenia cykli i asm polecam książkę Jana Ruszczyca "Assembler 6502" lub Henryka Kruszyńskiego i Krzysztofa Kulpy "Mikroprocesor 6502 i jego rodzina".
      Do DLI: omówienie przerwań w rozdziale 3 Zientary "Podstawowe procedury systemu operacyjnego" oraz Rozdział 7 w "Procedury wejścia-wyjścia" (nie ma tam nic o DLI, ale dużo o ANTICu, display liście, trybach graficznych i rejestrach sprzętowych).
      • 5: CommentAuthormono
      • CommentTime16 Feb 2010 00:02
       
      Jeśli robisz zmiany co linię w trybie graficznym, możesz też zaoszczędzić trochę czasu nie ustawiając przerwań DLI co linię (ich obsługa zabiera 7 cykli CPU + kod zachowujący rejestry na stosie + powrót z przerwania rti - czyli sporo), a tylko w pierwszej (a dokładnie przed pierwszą) i obsługiwać zmiany na jednym DLI.
      Niestety w ten sposób zablokujesz procesor (i przerwania maskowalne) na kawał czasu dzięki czemu nie masz co liczyć np. na komunikację z urządzeniami zewnętrznymi wymagającymi szybkiej obsługi IRQ (stacja dysków).
      Cytując mojego profesora od elektroniki: "Projektowanie to przede wszystkim sztuka znalezienia odpowiednich kompromisów" :D