atarionline.pl DLI - zmiana koloru + HSC - 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: CommentAuthordan
      • CommentTime27 Aug 2013 19:08
       
      Może ktoś z Was mi odpowie - bo kombinuje, debuguje i nie potrafię zrozumieć.

      W programie jedna jedyna procedura DLI:

      dli sta dli_a+1
      sty dli_y+1
      stx dli_x+1
      sta WSYNC
      ldx #0
      @
      mva OD_Duch0C,x COLPM0
      sta COLBAK
      mva OD_Duch1C,x COLPM1
      sta WSYNC
      inx
      cpx #150
      bcc @-
      @
      dli_a lda #0
      dli_y ldy #0
      dli_x ldx #0
      rti

      która przepisuje linia po linii kolor duszka (dla potrzeb testu również do koloru tła).

      I dla DL:
      ant dta b($70),b($70),b($70)
      dta b($42),a(tekst),b($02),b($02)
      dta b($20+$80)
      dta b($44),a(map),($4),($4) //1
      dta b($4),($4),($4) //2
      dta b($4),($4),($4) //3
      dta b($4),($4),($4) //4
      dta b($4),($4),($4) //5
      dta b($4),($4),($4) //6
      dta b($41),a(ant)

      wszystko działa poprawnie. Ale po zdefiniowaniu HSCROLLa w DL:

      ant dta b($70),b($70),b($70)
      dta b($42),a(tekst),b($02),b($02)
      dta b($20+$80)
      dta b($54),a(map),($14),($14) //1
      dta b($14),($14),($14) //2
      dta b($14),($14),($14) //3
      dta b($14),($14),($14) //4
      dta b($14),($14),($14) //5
      dta b($14),($14),($14) //6
      dta b($41),a(ant)

      mam efekt przesunięcia się kolorów względem postaci (im niżej ekranu tym większe przesunięcie).

      Dlaczego? Może mi to ktoś "łopatologicznie" wytłumaczyć.
      • 2: CommentAuthordan
      • CommentTime27 Aug 2013 21:08
       
      Hmmm czyżbym zbyt mocno obciążył DLI? robiąc to samo, ale w formie:
      .rept 150
      mva OD_Duch0C+# COLPM0
      sta COLBAK
      mva OD_Duch1C+# COLPM1
      sta WSYNC
      .endr

      zaczyna działać - czyli jak rozumiem, za bardzo sobie pofolgowałem na przerwaniu?
      • 3:
         
        CommentAuthorxeen
      • CommentTime27 Aug 2013 21:08
       
      pewnie się nie wyrabiasz.
      ale dlaczego z hscrollem obserwujesz inne zachowanie?
      • 4: CommentAuthorxxl
      • CommentTime27 Aug 2013 21:08
       
      przerwanie dli w Twoim programie zabiera 50% czasu procesora
      • 5: CommentAuthortebe
      • CommentTime28 Aug 2013 07:08
       
      najpierw ładujesz rejestry A-X-Y, potem STA WSYNC, na koniec zapis do właściwych rejestrów, np.

      lda #$22
      ldx #$80
      ldy #50

      sta wsync

      sta $d000
      stx $d001
      sty $d01a

      to jest najbardziej optymalny sposób
      • 6: CommentAuthor0xF
      • CommentTime28 Aug 2013 09:08
       
      Zauważ, że w pierwszej linii trybu znakowego 4 z HSCROLem ANTIC musi pobrać z pamięci prawie 96 bajtów (48 kodów znaków i 48 bajtów z fontu). Każde takie pobranie zajmuje cykl. Dodatkowo bajt DL i co najmniej jeden cykl odświeżenia pamięci. W linii dla 6502 i ANTICa jest 114 cykli. Teraz policz, ile cykli trwa obieg Twojej pętli.

      ANTIC będzie zabierał mniej cykli, jeśli wpiszesz duże wartości do HSCROL: lepiej $c-$f zamiast 0-3.
      • 7: CommentAuthortebe
      • CommentTime28 Aug 2013 13:08
       
      tego nie wiedziałem
      • 8: CommentAuthordan
      • CommentTime28 Aug 2013 13:08
       
      xxl - przepisanie 300 bajtów??
      tebe - dzięki, tak docelowo będzie. Zastanawiałem się tylko, dlaczego efekt się "zwiększa" im niżej schodzi postać. W końcu przerwanie zajmuje tyle samo czasu... przynajmniej tak mi się wydaje
      0xF - też nie wiedziałem. Tylko nie wiem czy dobrze zrozumiałem w linii wyrobi się 114 cykli pomniejszone o to co musi zrobić ANTIC? I w moim przypadku jest to co 8 linii? Dobrze załapałem?
      • 9: CommentAuthorxxl
      • CommentTime28 Aug 2013 13:08
       
      150 x sta wsync - zobacz co sie dzieje po zapisie do tego rejestru
      • 10: CommentAuthorEagle
      • CommentTime28 Aug 2013 13:08 zmieniony
       
      dan: Badlines - zoptymalizuj procedurę żeby się w co 8 lini wyrabiała z czasem.
      Tak jak pisze xxl procka DLI zajmuje połowę czasu procesora i chyba ciężko by to było obejść chyba że przestaniesz używać wsync i zaczniesz cyklować jak komodziarze przy otwieraniu borderów a zamiast nop'ów wciśniesz jakieś procedury :)
      • 11: CommentAuthordan
      • CommentTime28 Aug 2013 15:08
       
      ok ok - rozumiem. Nie mogłem sobie tylko wyobrazić dlaczego po zejściu w dół przesuwają się kolory coraz niżej. Teraz załapałem....
      • 12: CommentAuthor0xF
      • CommentTime28 Aug 2013 15:08
       
      Tutaj dokładnie sprawdzisz, co robi ANTIC w którym cyklu w linii: ->link<-
      No i oczywiście powinieneś wiedzieć, ile cykli zajmują poszczególne instrukcje 6502.
      • 13: CommentAuthordan
      • CommentTime28 Aug 2013 23:08
       
      0xF - dzięki, ten plik wiele mi wyjaśnił.