atarionline.pl Graphics 9 z poziomu assemblera - 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: CommentAuthortomaswoj
      • CommentTime22 May 2016 09:05
       
      Cześć,

      zaczynam swoją przygodę dopiero i mam pytanie:
      - czy z poziomu czystego assemblera da się ustawić Gr.9 (ale graficzny) bez konieczności specyfikowania display listy?

      Teraz robie tak:
      LDA #64
      STA 623

      I generalnie tryb sie ustawia, ale jak coś wrzucę w pamięć ekranu, to pojawia się jakiś 'losowy' kleks - zajmuje mi to 2 kolumny (po 4 piksele każda) na wysokość znaku. Obstawiam więc, że mam Gr0 z ustawionym trybem 9 GTIA, ale nadal jest to tryb znakowy. Zwłaszcza że nie znika mi kursor (0,0).

      Jaki jest najprostszy (najmniejszy obiętościowo) sposób żeby uzyskać "czysty", graficzny tryb 9?

      Przegrzebałem parę tutoriali, dokumentów, itd. ale tam wszędzie jest display lista. A jeśli chcę mieć po prostu standardowy, niemieszany, bez DLI, bez scrollingow, tryb 9? Też muszę DL specyfikować?

      Z góry dzięki za wszelkie porady!
      • 2:
         
        CommentAuthorlarek
      • CommentTime22 May 2016 10:05 zmieniony
       
      Tryb graficzny 9 to dla Antica nic innego jak tryb graficzny 8. Musisz, jak dla każdego trybu zbudować odpowiednią Display List. Później - tak jak to robisz - informujesz GTIA, że to ma być tryb 9.

      Do zbudowania odpowiedniego DL można wykorzystać OS, czyli wykonać OPEN "coś tam" z parametrami GR8. Na Atariki była chyba odpowiednia procedura, ale Atariki ostatnio leży martwe...

      Budowa własnego DL nie jest trudna :)
      • 3: CommentAuthortomaswoj
      • CommentTime22 May 2016 11:05
       
      Hej Larek,

      dzięki wielkie za odpowiedź. Reasumując - nie da się ustawić żadnego trybu graficznego bez zbudowania DL? Pytam, bo przymierzam się do 256b na SV, a tutaj jak wiadomo każdy bajt na wagę złota. Ot takie fanaberie wynikające z kryzysu wieku średniego :)
      • 4: CommentAuthorxxl
      • CommentTime22 May 2016 11:05
       
      oczywiscie ze sie da...

      lda #8
      jsr $EF9C
      lda #64
      sta 623

      natomiast jesli chcesz zdobyc poklask wsrod planktonu to uzyj CIO.
      • 5:
         
        CommentAuthorlarek
      • CommentTime22 May 2016 11:05 zmieniony
       
      Poczekaj chwilę to pewnie zaraz ktoś napisze jak wywołać jakąś procedurę w OS/może BASIC (jeśli ona tam jest). Ja się na tym nie znam i zawsze robię to "ręcznie" :)


      edit

      XXL i Wieczór mnie uprzedzili :)
      • 6: CommentAuthorwieczor
      • CommentTime22 May 2016 11:05
       
      Tryb graficzny to właśnie display list :) Atari nie ma czegoś takiego jak ogólnie tryb - tylko linie w różnych trybach i trzeba go poinformować jakie one mają być :) Ale tak jak Larek podpowiedział - są w OSie procedury robiące takie rzeczy, przypuszczam, że skoro to 256b to RAMu pod BASIC-iem czy OS-em nie potrzebujesz? ;)
      • 7: CommentAuthorwieczor
      • CommentTime22 May 2016 11:05 zmieniony
       
      Tylko nie wiem czy się to opłaci, bo i tak będziesz musiał sprawdzić gdzie on to w pamięci zrobił :) Przypuszczalnie pętla budująca DL z pamięcią obrazu tam gdzie chcesz może zajmować mniej ;)

      Edit

      A może nie - jeśli wiesz co masz włączone to wiadomo gdzie to jest.
      • 8: CommentAuthortomaswoj
      • CommentTime22 May 2016 11:05
       
      Dzięki XXL.

      wygląda obiecująco, bo jak rozumiem to wywołanie OPEN z OSa o którym wspominał Larek (co mi uświadamia jak króciutki jeszcze jestem, że nie zrozumiałem odpowiedzi :/). Tyle że niestety wygląda na to że u mnie nie zadziałało :/. Dalej, po wywołaniu w/w sekwencji jak wrzucam coś w pamięć ekranu, to dostaje 'piksel' 8x8 podzielony na dwie kolumny 4x8. Używam WUDSN/MADS + Altirra (jeśli to może mieć jakikolwiek wpływ). BASIC wygląda na wyłączony.

      Z góry przepraszam, jeśli to są trywialne pytania, ale nie znam żadnego innego forum gdzie mógłbym je zadać :).
      • 9: CommentAuthorxxl
      • CommentTime22 May 2016 11:05
       
      to zadziala tylko jesli atari ma oryginalny rom... w alitirze podejrzewam masz podpiety jakis inny.

      na party po prostu upieraj sie zeby uruchamiac Twoj program na prawdziwym atari a nie jakims przerabianym mutancie ;-)
      • 10: CommentAuthorxxl
      • CommentTime22 May 2016 11:05
       
      lda #8
      jsr $ef9c
      lda #64
      sta 623
      lda #$f0
      sta $b000

      pixel miej wiecej w polowie ekranu - sprawdzilem teraz na emulatorze atari800 win plus
      • 11: CommentAuthortomaswoj
      • CommentTime22 May 2016 12:05
       
      Na A800winplus z wyłączonym basic z OS-B działa! Dzięki wszystkim za pomoc! :)
      • 12: CommentAuthorwieczor
      • CommentTime22 May 2016 12:05
       
      W Altirze też działa. ROM ATARIXL.ROM (nie wiem jaka to wersja). A może przypadkiem wyłączasz ROM?
      • 13: CommentAuthorpin
      • CommentTime22 May 2016 12:05
       
      XXL, czyli atari z innym romem to już mutant? ;) dobre.
      • 14: CommentAuthortomaswoj
      • CommentTime22 May 2016 12:05
       
      @Wieczor,

      też działa, faktycznie. Pewnie wpadłem w typowe problemy newbie, gdzie zbyt dużo zmian równocześnie spowodowało że przestałem panować nad konfiguracją. Dzięki jeszcze raz! :) Mam nadzieję, że nie zabrałem/zmarnowałem zbyt dużo Waszego czasu!
      • 15: CommentAuthormono
      • CommentTime23 May 2016 10:05
       
      ->link<-
      Polecałbym użycie CIO a nie skoków do ROM-u, bo Atari to nie C64 i ma różne ROM-y w różnych maszynach.
      • 16: CommentAuthorwieczor
      • CommentTime23 May 2016 10:05
       

      xxl:

      to zadziala tylko jesli atari ma oryginalny rom


      Absolutnie każdy? Bo tych oryginalnych jest kilka. Wszystkie mają to w tym miejscu?
      • 17: CommentAuthor0xF
      • CommentTime23 May 2016 13:05
       
      Wzorcowy i bezproblemowy kod jest w linku podesłanym przez mono.
      • 18:
         
        CommentAuthorGeorge
      • CommentTime8 Nov 2023 08:11
       
      Hej, znalazałem ten wątek przeszukując forum na temat otwarcia trybu graficznego z assemblera.
      Dlaczego w tym kodzie: ->link<-
      jest skok: jsr cioexe
      zanim się poustawia pozostałe parametry?
      • 19: CommentAuthormono
      • CommentTime8 Nov 2023 09:11
       
      Bo to jest prewencyjne zamknięcie #6 gdyby był wcześniej otwarty.
      • 20:
         
        CommentAuthorGeorge
      • CommentTime8 Nov 2023 09:11
       
      kapewu, dzięki.
      • 21:
         
        CommentAuthorKaz
      • CommentTime8 Nov 2023 12:11
       
      George - coś się szykuje programistycznego? :)
      • 22:
         
        CommentAuthorGeorge
      • CommentTime8 Nov 2023 19:11
       
      Próbuję programować grafikę w sposób profesjonalny, czyli w assemblerze.

      Aktualnie staram się odpalić program do szybkiego rysowania okręgu, na podstawie artykułu z Compute! Oczywiście jest bug w listingu, więc debuguje, a do tego musiałem zdeassemblować program i przygotować go pod MAC/65.

      Chcę też się pozbyć rozpędówki Basicowej i uruchamiać program z DOSa bez Basica.
      Bawię się bezpośrednio na fizycznym Atari i musiałem też sobie wybrać i nauczyć się narzędzi developerskich (DOS XL, MAC/65. BUG/65).
      Myślę, że podstawy już znam i idzie do przodu.
      Może jak dobrze pójdzie to jakiś post na blogu z tych przygód będzie, ale nie zapeszam.
      • 23:
         
        CommentAuthorKaz
      • CommentTime8 Nov 2023 20:11
       
      Trzymam kciuki i czekam na bloga z przygód programistycznych! :)
      • 24: CommentAuthortebe
      • CommentTime8 Nov 2023 21:11
       
      wszystko zostało opisane, zakodowane w asm, tylko następny spotkał facetów w czerni i wykasowali mu pamięć
      • 25: CommentAuthorbob_er
      • CommentTime8 Nov 2023 22:11
       
      @tebe - czasami chodzi o to, by się samemu pobawić i coś w asm podłubać, a nie o pisanie na czas i posiłkowanie się gotowymi libami.
      Terminy to mamy w pracy, nie tutaj :).
      • 26:
         
        CommentAuthorKaz
      • CommentTime8 Nov 2023 22:11
       
      Amen!
      • 27:
         
        CommentAuthorGeorge
      • CommentTime8 Nov 2023 22:11
       
      @Kaz - dzięki!
      @tebe - trochę nie rozumiem komentarza, komu wykasowali pamięć?
      @bob_er - Tak, o to chodzi. Żeby nauczyć się asm i jak kodować grafikę Atari.

      Chyba nie da się inaczej niż robiąc to.
      • 28:
         
        CommentAuthorGeorge
      • CommentTime19 Nov 2023 00:11
       
      No dobra, to zrobiłem wszystko co chciałem, ale oczywiście są bugi.
      Przede wszystkim wydaje mi się, że ta procedurka ->link<-
      wprawdzie odpali żądany tryb graficzny, ale suma sumarum nie wróci w żadne rozsądne miejsce, żeby oddać kontrolę mojemu programowaniu, chyba, że się mylę?
      No bo pierwszy skok: 'jsr cioexe' zostawi adres powrotu (trochę ubocznie dla następującego za chwilę jmp), ale drugi: 'jmp jciomain' już nie umożliwi powrotu?
      • 29: CommentAuthormono
      • CommentTime19 Nov 2023 02:11
       
      Wywołaj to przez
      jsr gr9
      i wszystko będzie w porządku.
      • 30: CommentAuthorlzd
      • CommentTime19 Nov 2023 14:11 zmieniony
       

      George:

      wprawdzie odpali żądany tryb graficzny, ale suma sumarum nie wróci w żadne rozsądne miejsce

      jsr JCIOMAIN
      rts

      jest tożsame z
      jmp JCIOMAIN
      • 31:
         
        CommentAuthorGeorge
      • CommentTime20 Nov 2023 12:11 zmieniony
       
      @mono - tak, oczywiście o to chodziło, jakbyś widział mój kod.
      Odpaliłem procedurę z buta, zamiast JSR. Dzięki!

      @lzd - przyznam się, że nie rozumiem tego. Według mnie to nie są tożsame rzeczy. jmp nie odkłada adresu powrotu na stosie.

      BTW, w swoim kodzie, odpalam GR8, także ten... ;)
      • 32: CommentAuthorgorgh
      • CommentTime20 Nov 2023 14:11
       

      George:

      Według mnie to nie są tożsame rzeczy.

      a jakie masz podstawy tak sądzić?
      • 33: CommentAuthormono
      • CommentTime20 Nov 2023 15:11
       

      George:

      przyznam się, że nie rozumiem tego. Według mnie to nie są tożsame rzeczy. jmp nie odkłada adresu powrotu na stosie.
      Tu nie ma nic do rozumienia :) To nie jest język wysokiego poziomu.
      JSR kładzie adres następnej instrukcji na stos po czym skacze pod podany w argumencie adres (ładuje PC argumentem instrukcji JSR). RTS ściąga adres ze stosu i ładuje do licznika programu PC czyli kontynuuje wykonanie programu od adresu ściągniętego ze stosu. JMP niczego nie zdejmuje ani nie kładzie na stos - tylko ładuje licznik PC.
      • 34:
         
        CommentAuthorjhusak
      • CommentTime20 Nov 2023 16:11
       
      Dopowiem.

      Więc jak masz kod:

      (...)
      jsr gdzieś
      rts

      to jest to PRAWIE tożsame z
      (...)
      jmp gdzieś

      Bo jeśli jest jsr/a potem rts: jest rts to znaczy, że tu ktos skoczył jsr i oczekuje powrotu. I wewnątrz jsr skoczy gdzieś, wróci, a następnie wykona się rts i też wróci. A jeśli jest jmp, to wróci bezpośredni stamtąd. Taki skrót, oszczędzone bajty na stosie, przyspieszone działanie i jeden bajt mniej kodu.

      To PRAWIE tożsame dotyczy działania, ale jest szybsze i mniej kodu, więc nie jest tożsame (nie w 100%).
      • 35: CommentAuthorlzd
      • CommentTime20 Nov 2023 17:11
       
      Pisząc "tożsame", miałem na myśli efekt końcowy. Różnice w objętości i czasie wykonania powinny być dla wszystkich oczywiste.
      • 36:
         
        CommentAuthorGeorge
      • CommentTime20 Nov 2023 17:11
       
      OK. Ja literalnie wziąłem te linijki kodu, które napisał lzd.
      A miał pewnie jeszcze w ukrytym założeniu jsr, o którym nie napisał.

      Czyli tożsamość funkcjonalna jest pomiędzy:
      JSR gdzieś
      rts

      a
      JSR tu
      ...
      tu JMP gdzieś


      Dzięki za wyjaśnienia.
      • 37: CommentAuthortebe
      • CommentTime20 Nov 2023 17:11 zmieniony
       
      proszę rozwiń skrót JSR George, oraz JMP ...

      rozumiesz co piszesz czy przyjmujesz wszystko na wiarę?
      • 38:
         
        CommentAuthorGeorge
      • CommentTime20 Nov 2023 17:11
       
      Tak, staram się rozumieć, co piszę.
      Tak, umiem rozwinąć.
      Można prosić o konstruktywny komentarz?
      • 39:
         
        CommentAuthorjhusak
      • CommentTime20 Nov 2023 18:11
       
      Zarówno @tebe, jak i @lzd to "starzy wyjadacze" i już zapomnieli, jak zaczynali z 6502 :) Chłopaki, nie dla wszystkich jest oczywiste, jak działa 6502!
      • 40:
         
        CommentAuthorCosi
      • CommentTime20 Nov 2023 18:11
       
      Może dorzucę trzy grosze, bo wbrew pozorom nie tylko 6502 tak działa – to jest mechanizm, który w językach wyższego poziomu nazywa się "optymalizacją ogonową" (tail optimization).

      Jeżeli założymy, że każde `jsr` odkłada na stos "adres powrotu do domu", a każde `rts` ściąga ten adres ze stosu i "wraca do domu", to w dwóch wyżej podanych przypadkach:

      start
      jsr proc1 ; 1. wrzuca adres "start" na stos i idzie do proc1

      proc1
      jsr proc2 ; 2. wrzuca adres "proc1" na stos i idzie do proc2
      rts ; 4. ściąga adres "start" ze stosu i wraca tam

      proc2
      rts ; 3. ściąga adres "proc1" ze stosu i wraca tam


      A teraz:
      start
      jsr proc1 ; 1. wrzuca adres "start" na stos i idzie do proc1

      proc1
      jmp proc2 ; 2. nie wrzuca NIC na stos i idzie do proc2

      proc2
      rts ; 3. ściąga adres z wierzchu stosu - jaki? "start"! - i wraca tam
      • 41:
         
        CommentAuthorGeorge
      • CommentTime22 Nov 2023 17:11
       
      @Cosi - W punkt!