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
     
    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 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
     
    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
     
    Ż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
     
    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