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
     
    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
     
    na 2: pla, pla
    na 3: tsx, pla, txs

    nie wiem czy o to chodzi...
    • 3:
       
      CommentAuthorxeen
    • CommentTime1 May 2016
     
    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
     
    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
     
    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
     
    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
     
    no tak, oczywiste :)
    podziękował
    • 8:
       
      CommentAuthorxeen
    • CommentTime1 Sep 2016
     
    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 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 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
     
    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
     
    ok, dzięki
    • 13: CommentAuthor0xF
    • CommentTime1 Sep 2016
     
    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
     
    Bardzo fajne i pożyteczne narządko - dzięki!
    • 15:
       
      CommentAuthorxeen
    • CommentTime9 Apr 2017
     
    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
     
    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
     
    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 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 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
     

    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
     
    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 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 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
     
    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
     
    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 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
     
    dzięki mono
    • 28: CommentAuthormono
    • CommentTime21 Sep 2018 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
     
    Baardzo sprytne :)
    • 30: CommentAuthorgorgh
    • CommentTime21 Sep 2018 zmieniony
     
    Xeen: czemu nie możesz stablicować? to tylko 256 bajtów
    • 31: CommentAuthormono
    • CommentTime21 Sep 2018
     
    @gorgh: Bo xeen tu czasami wrzuca różne zagadki :) To takie rozwiązywanie krzyżówek.
    • 32: CommentAuthorgorgh
    • CommentTime21 Sep 2018
     
    mono jest znany z bycia pomocnym, to fakt
    • 33:
       
      CommentAuthorxeen
    • CommentTime21 Sep 2018
     
    @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
     
    hehe
    • 35:
       
      CommentAuthorxeen
    • CommentTime18 Oct 2018
     
    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
     
    A a czemu nie $d01d ?
    • 37: CommentAuthorsolo/ng
    • CommentTime18 Oct 2018 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
     
    ok, dzięki
    • 39:
       
      CommentAuthorxeen
    • CommentTime19 Jul 2019
     
    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
     
    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
     
    dziękuję