atarionline.pl asm - lamerskie pytanie - 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
      • CommentTime1 May 2016 23:05
       
      Czy da się zrobić dokładnie 8 cykli na mniej niż 4 bajtach bez nielegali?

      Nie znalazłem, ale na wszelki wypadek postanowiłem spytać.
      • 2: CommentAuthorxxl
      • CommentTime1 May 2016 23:05
       
      na 2: pla, pla
      na 3: tsx, pla, txs

      nie wiem czy o to chodzi...
      • 3:
         
        CommentAuthorxeen
      • CommentTime1 May 2016 23:05
       
      nie zdążyłem skasować
      zmęczony byłem jak pisałem
      tak - można zrobić na wiele sposobów

      sorry!
      • 4: CommentAuthor0xF
      • CommentTime2 May 2016 07:05
       
      Nieinwazyjnie np.: cmp (0,x) nop

      Do dokładnego cyklowania bez modyfikacji rejestrów przydają się różne tryby adresowania cmp:
      cmp #0 ; 2
      cmp 0 ; 3
      cmp 0,x ; 4
      cmp (0),y ; 5 ale tylko gdy y=0 lub 0 pod 0
      cmp (0,x) ; 6 zawsze
      • 5:
         
        CommentAuthorxeen
      • CommentTime1 Aug 2016 00:08
       
      nie jest to związane z assemblerem, ale:

      w jakie sposób pod emulatorem wyświetlić w monitorze zawartość wybranego banku pamięci?
      • 6: CommentAuthormono
      • CommentTime1 Aug 2016 09:08
       
      Pod atari800 robię sobie zawsze:

      [F8]
      m d301
      c d301 xx
      m 4000
      c d301 yy
      cont

      Trochę uciążliwe, ale działa :)
      • 7:
         
        CommentAuthorxeen
      • CommentTime1 Aug 2016 17:08
       
      no tak, oczywiste :)
      podziękował
      • 8:
         
        CommentAuthorxeen
      • CommentTime1 Sep 2016 12:09
       
      W konsoli Atari800win mam polecenie write, które zapisuje zadany fragment pamięci do pliku.
      Czy istnieje jakiś tool, który pozwala robić to na skompiloanym pliku podanym jako parametr?
      • 9: CommentAuthormono
      • CommentTime1 Sep 2016 13:09 zmieniony
       
      Eeee. Ale o co konkretnie chodzi? Co ma robić tool? Na jakiej platformie? Skrót myślowy jest za wielki dla mnie :)

      Edit: Jeśli chcesz wyciąć kawałek pliku, to na unixach w systemie jest narzędzie:
      dd if=plik_wejsciowy of=plik_wyjsciowy bs=1 skip=ile_ominac count=ile zgrac

      SDX też takie narzędzie ma, ale składnia jest trochę inna
      dd count,skip

      i przycina to, co mu podasz na wejście np:
      dd count,skip<<plik_wejsciowy>>plik_wyjsciowy
      • 10:
         
        CommentAuthorxeen
      • CommentTime1 Sep 2016 14:09 zmieniony
       
      tool ma robić to co napisałeś, tylko chciałbym w nim posługiwać się adresami $0000 - $ffff jako parametr obszaru mnie interesującego, a nie wnikać co gdzie w pliku xex / obx jest.

      zakładam, że obszary "nezaorgowane" to 0.

      usage:

      tool plik.obx $5000 - $6000 d:/fragment

      osobiście nadal używam raczej systemów microsoftu w domu do rzeczy związanych z hobby - także polecenie na unix / linux / osx jak ktoś sobie napisał to mnie raczej nie urządzi.

      dziękuję
      • 11: CommentAuthormono
      • CommentTime1 Sep 2016 15:09
       
      Czyli potrzebujesz coś, co załaduje plik binarny do 64K pamięci i potem z tego obszaru chciałbyś sobie zgrywać dowolny blok. Czy ma to wykonywać bloki init?
      Poza atari800 z paczem ->link<- to nie znam. Do spaczowanego atari800 można próbować wysyłać polecenia przez stdin.
      • 12:
         
        CommentAuthorxeen
      • CommentTime1 Sep 2016 15:09
       
      ok, dzięki
      • 13: CommentAuthor0xF
      • CommentTime1 Sep 2016 22:09
       
      To chwilka pisania, załączam.

      Przykład użycia:
      perl xexcut.pl Drunk_Chessboard.xex 3ffe 4001 xexcut-test


      Perla na Windows można dostać na wiele sposobów, ja polecam ->link<- - wystarczy w nim wyklikać pakiet o nazwie "perl".
      • 14: CommentAuthorwieczor
      • CommentTime1 Sep 2016 22:09
       
      Bardzo fajne i pożyteczne narządko - dzięki!
      • 15:
         
        CommentAuthorxeen
      • CommentTime9 Apr 2017 20:04
       
      wybaczcie bardzo lamerskie pytanie na które sam mogę sobie odpowiedzieć sprawdzając, ale wolałbym to potwierdzić na RHW a aktualnie nie mam takiej możliwości.

      Czy można przełączać banki pamięci w linii na DLI? Antic z pamięcią ekranu oczywiście wskazuje na obszar poza $4000-$7fff. Ale charsety już są w bankach właśnie, a DL ma miec też tryby znakowe i wskazywaniem na charsety chcę manipulować

      dziękuję
      • 16: CommentAuthor0xF
      • CommentTime9 Apr 2017 21:04
       
      Oczywiście możesz przełączać banki pamięci, w których są zestawy znaków. Powinieneś tylko wziąć pod uwagę, że rozszerzenia pamięci można podzielić na trzy grupy ze względu na dostęp ANTICa:

      1. Wspólny dostęp ANTICa i 6502 (Rambo, 1 MB).
      2. Osobny dostęp ANTICa i 6502 (130 XE, Compy Shop). Tutaj powinieneś zadbać, aby wartość w PORTB włączała dostęp ANTICa do rozszerzenia. Uwaga: procedury wykrywające banki zwykle tego nie robią.
      3. Brak dostępu ANTICa do pamięci rozszerzonej. To nie jest chyba zbyt popularne rozszerzenie, ale słyszałem, że takie istnieje.
      • 17: CommentAuthormono
      • CommentTime9 Apr 2017 21:04
       
      Bank można przełączyć w dowolnej chwili, więc i na DLI można.
      Problem tutaj jest inny. ANTIC w trybie tekstowym musi odczytać jakie znaki są użyte w wierszu i robi to w pierwszej linii skanningowej (odczytuje z RAM do wewnętrznego bufora). W każdej linii skanningowej (czyli również w pierwszej) odczytuje też zawartość kolejnych linii znaku z generatora - te dane nie są buforowane no bo to nie ma sensu.
      Ta pierwsza linia wiersza jest nazywa badline'm bo CPU jest tam praktycznie cały czas zablokowany (dużo danych trzeba przeczytać). Poza tym dane z generatora i z pamięci obrazu czytane są naprzemiennie.
      Nie da się więc zrobić tak, żebyś w pierwszej lini skanningowej wiersza miał dane ekranu z innego banku niż dane generatora. Poza bad line dane pamięci ekranu są już zbuforowane więc tam pobierane są już tylko dane z generatora znaków. Więc wszystkie linie skanningowe poza badline mogą być czytane z innego banku niż dane ekranu.

      Teraz wszystko zależy od tego czy pierwsza linia skanningowa ma we wszystkich generatorach te same dane - jeśli tak, to na DLI włączasz bank z pamięcią ekranu i pierwszą linią skanningową znaków (na ramce), robisz WSYNC (czyli czekasz aż minie badline) i przełączasz bank na docelowy zestaw znaków (z resztą linii skanningowych).

      Jeśli pamięć ekranu może leżeć poza bankami no to wtedy przełączasz na DLI tylko generatory znaków i wszystko będzie się malowało jak należy (choćby tryby Avalonowe tak działają).

      Przejrzyj diagramy dostępu ANTIC-a do pamięci dla odpowiedniego trybu w AltirraReference Manual i wszystko stanie się jasne :)
      • 18:
         
        CommentAuthorxeen
      • CommentTime9 Apr 2017 22:04 zmieniony
       
      dziękuję za wyjaśnienia.

      Ja nie chcę robić nic z pamięcią ekranu, która jest u mnie poza obszarem na banki. Ja chcę tylko zmieniać charsety, które nazywane są powyżej generatorami. Z przyczyn różnych nie chcę przełączać tylko charsetów / generatorów (numer strony pamięci na nie wskazujący), ale także chcę manipulować bankami aby osiągnąć taki sam efekt.
      Nie wiem czy dobrze zrozumiałem powyższe, ale zakładam, że to zadziała. Problem będzie oczywiście w BL tylko wtedy gdy będę chciał też zmieniać pamięć ekranu - ale tego nie chcę. W BL (i dokładnie tam) chcę przełączyć zaraz po WSYNC bank aby wyświetlić inną grafikę znaków, mimo braku zmiany numeru strony w rejestrze odpowiedzialnym za namiar na charset / generator.
      • 19: CommentAuthormono
      • CommentTime10 Apr 2017 10:04 zmieniony
       
      Zadziała. Zerknij tylko czy po WSYNC nie trzeba paru cykli żeby zapis do PORTB/CHBASE odbył się już na ramce.

      Edit: Pamiętaj o rozszerzeniach z oddzielnym dostępem ANTIC-a do XRAM.
      • 20: CommentAuthor0xF
      • CommentTime10 Apr 2017 16:04
       

      mono:

      Zerknij tylko czy po WSYNC nie trzeba paru cykli żeby zapis do PORTB/CHBASE odbył się już na ramce.

      Przy normalnej szerokości nie trzeba. Przy szerokiej przyda się kilka cykli między STA WSYNC a STA PORTB.
      • 21:
         
        CommentAuthorxeen
      • CommentTime10 Apr 2017 19:04
       
      No to pozwolę sobie zapytać po co te dodatkowe cykle, bo intuicyjnie wydaje się, że im wcześniej zmienię PORTB tym lepiej. Zwłaszcza w trybie z 48 bajtami.
      Czy dla 32 bajtów (wąski) też są jakieś specyficzne reguły?

      dziękuję
      • 22: CommentAuthor0xF
      • CommentTime10 Apr 2017 20:04 zmieniony
       
      WSYNC wstrzymuje procesor do początku prawej ramki normalnego obrazu. Czyli jeśli Twój ekran wyświetla sporo prawej ramki, to zmiany koloru lub zestawu znaków będą widoczne po prawej stronie. Bardzo często to widać w istniejących produkcjach, szczególnie w Altirze, która wyświetla spory obszar ramki.

      Edit: przy wąskim obrazie WSYNC zatrzyma się już po wyświetleniu treści, więc zmianę zestawu znaków możesz zrobić od razu po WSYNC. A nawet przed WSYNC, ale to już wyższa szkoła jazdy, tzw. cyklowanie. Natomiast ciągle trzeba uważać z COLBAK.
      • 23: CommentAuthormono
      • CommentTime10 Apr 2017 20:04 zmieniony
       
      Przerwanie DLI jest obsługiwane w 10 cyklu ostatniej linii skanningowej wiersza. Obsługa przerwania zajmuje:
      <zakończenie poprzedniego rozkazu> ;max 6 cykli
      <sekwencja wejścia w przerwanie> ;7 cykli
      bit NMIST ;4 cykle
      bpl VBL ;2 cykle
      jmp (DLIV) ;5 cykli

      czyli jakieś 18..24 cykli CPU. Biorąc pod uwagę cykle zabierane przez ANTIC na rysowanie i odświeżanie pamięci okaże się że Twój program zacznie się wykonywać około 36 do 60 cyklu linii skanningowej (widoczny playfield trybu wąskiego rozpoczyna się od 24 cyklu linii a kończy w 88).
      WSYNC stopuje CPU do 105 cyklu (linia ma 114 cykli).
      Jeśli zmienisz PORTB/CHBASE przed końcem malowania playfielda, wtedy kształt znaków począwszy od punktu zmiany będzie brany z generatora nowego banku.

      Edit: Uwaga na cyklowanie, bo w trybie turbo będą kłopoty.

      Edit 2: Zapis do WSYNC haltuje CPU do 105 cyklu - jeśli w międzyczasie wystąpi przerwanie IRQ, jego obsługa zostanie odroczona do chwili kiedy zakończysz obsługę swojego przerwania NMI.
      • 24:
         
        CommentAuthorxeen
      • CommentTime21 Sep 2018 08:09
       
      znacie jakiś szybki i krótki sposób na odbicie lustrzane bitów w bajcie (bez LOOKUP table)?

      01100001 -> 10000110

      itp?
      dzięki
      • 25: CommentAuthormono
      • CommentTime21 Sep 2018 09:09
       
      Poza lookup table niestety tylko tradycyjnie:
      sta tmp
      lsr tmp
      rol
      lsr tmp
      rol
      lsr tmp
      rol
      lsr tmp
      rol
      lsr tmp
      rol
      lsr tmp
      rol
      lsr tmp
      rol
      lsr tmp
      rol

      3+(5+2)*8=59 cykli.
      • 26: CommentAuthormono
      • CommentTime21 Sep 2018 10:09 zmieniony
       
      ale:
      m  tay                  ;2
      and #%10000001 ;2
      beq ?1 ;2/3
      eor #%10000001 ;2
      bne ?1 ;2/3
      eor #%10000001 ;2
      ?1 sta ?4+1 ;4

      tya
      and #%01000010
      beq ?2
      eor #%01000010
      bne ?2
      eor #%01000010
      ?2 sta ?5+1

      tya
      and #%00100100
      beq ?3
      eor #%00100100
      bne ?3
      eor #%00100100
      ?3 sta ?6+1

      tya
      and #%00011000
      beq ?4
      eor #%00011000
      bne ?4
      eor #%00011000
      ?4 ora # ;2
      ?5 ora # ;2
      ?6 ora # ;2

      bierze 46-66 cykli.
      • 27:
         
        CommentAuthorxeen
      • CommentTime21 Sep 2018 11:09
       
      dzięki mono
      • 28: CommentAuthormono
      • CommentTime21 Sep 2018 11:09 zmieniony
       
      Ale jeszcze jedno ale :)
      Bo zauważyłem, że pierwsza procedura ma pewną zaletę, dzięki której możesz zredukować ilość cykli na pojedynczy mirror o połowę :) Pod pewnymi jednak warunkami.
      Jeśli potrzebujesz zrobić mirror dwóch bajtów naraz możesz zrobić tak (.A jeden bajt, .Y drugi):
      sty tmp
      lsr
      rol tmp
      ror
      rol tmp
      ror
      rol tmp
      ror
      rol tmp
      ror
      rol tmp
      ror
      rol tmp
      ror
      rol tmp
      ror
      rol tmp
      ror
      ldy tmp

      W wyniku w .A dostaniesz drugi bajt zmirrorowany, a w .Y pierwszy. C jest zawsze 0.
      Wykonuje się 64 cykle na dwa bajty, a więc 32 cykle na bajt :)

      Edit: Czyli krótko mówiąc - masz zmirrorowane słowo .YA.
      • 29:
         
        CommentAuthorjhusak
      • CommentTime21 Sep 2018 13:09
       
      Baardzo sprytne :)
      • 30: CommentAuthorgorgh
      • CommentTime21 Sep 2018 13:09 zmieniony
       
      Xeen: czemu nie możesz stablicować? to tylko 256 bajtów
      • 31: CommentAuthormono
      • CommentTime21 Sep 2018 13:09
       
      @gorgh: Bo xeen tu czasami wrzuca różne zagadki :) To takie rozwiązywanie krzyżówek.
      • 32: CommentAuthorgorgh
      • CommentTime21 Sep 2018 14:09
       
      mono jest znany z bycia pomocnym, to fakt
      • 33:
         
        CommentAuthorxeen
      • CommentTime21 Sep 2018 14:09
       
      @gorgh - pewnie, że mogę i tak zrobię w moim przypadku. Ale chciałem się upewnić, czy nie ma mega triku że nie warto. i przy okazji się czegoś nauczyłem bo ten ostatni przykład jest bardzo fajny.

      dzięki mono
      • 34: CommentAuthorgorgh
      • CommentTime21 Sep 2018 14:09
       
      hehe
      • 35:
         
        CommentAuthorxeen
      • CommentTime18 Oct 2018 16:10
       
      mam duchy i chce je wyłączyć.
      kasuje więc odpowiednie bity w $d400 (2 i 3) - ale nadal mam śmieci na ekranie "duchowe"
      z czego to wynika i co jeszcze trzeba zrobić bo nie chcę ustawiać wszystkim pozycji 0 :)
      • 36: CommentAuthorVidol
      • CommentTime18 Oct 2018 16:10
       
      A a czemu nie $d01d ?
      • 37: CommentAuthorsolo/ng
      • CommentTime18 Oct 2018 16:10 zmieniony
       
      jak podal Vidol, tutaj wpisz 0 do gractl:
      ->link<-

      oprocz dostepu do pamieci (DMA) jest dodatkowy switch on/off; polecam zawsze wylaczac oba
      • 38:
         
        CommentAuthorxeen
      • CommentTime18 Oct 2018 16:10
       
      ok, dzięki
      • 39:
         
        CommentAuthorxeen
      • CommentTime19 Jul 2019 15:07
       
      czy da się w madsie za pomocą konstrukcji .rept / .endr
      tworzyć dynamicznie etykiety, zmienne suffixowane liczbą (czyli # pomiędzy znacznikami powtórzeń)?
      • 40: CommentAuthorxxl
      • CommentTime19 Jul 2019 16:07
       
      1 opt l+
      2
      3 org $600
      4 .rept 3, #
      5 PUPA:1
      6 .BYTE #
      7 .ENDR
      7 .endr
      Source: REPT
      5 PUPA0
      5 FFFF> 0600-0602> 00 .BYTE #
      5 0601 PUPA1
      5 0601 01 .BYTE #
      5 0602 PUPA2
      5 0602 02 .BYTE #
      Source: test.asm
      • 41:
         
        CommentAuthorxeen
      • CommentTime22 Jul 2019 19:07
       
      dziękuję