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
     
    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 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
     
    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
     
    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 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
     
    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 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
     
    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
     
    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
     
    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
     
    Na A800winplus z wyłączonym basic z OS-B działa! Dzięki wszystkim za pomoc! :)
    • 12: CommentAuthorwieczor
    • CommentTime22 May 2016
     
    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
     
    XXL, czyli atari z innym romem to już mutant? ;) dobre.
    • 14: CommentAuthortomaswoj
    • CommentTime22 May 2016
     
    @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
     
    ->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
     

    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
     
    Wzorcowy i bezproblemowy kod jest w linku podesłanym przez mono.
    • 18:
       
      CommentAuthorGeorge
    • CommentTime8 Nov 2023
     
    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
     
    Bo to jest prewencyjne zamknięcie #6 gdyby był wcześniej otwarty.
    • 20:
       
      CommentAuthorGeorge
    • CommentTime8 Nov 2023
     
    kapewu, dzięki.
    • 21:
       
      CommentAuthorKaz
    • CommentTime8 Nov 2023
     
    George - coś się szykuje programistycznego? :)
    • 22:
       
      CommentAuthorGeorge
    • CommentTime8 Nov 2023
     
    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
     
    Trzymam kciuki i czekam na bloga z przygód programistycznych! :)
    • 24: CommentAuthortebe
    • CommentTime8 Nov 2023
     
    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
     
    @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
     
    Amen!
    • 27:
       
      CommentAuthorGeorge
    • CommentTime8 Nov 2023
     
    @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
     
    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
     
    Wywołaj to przez
    jsr gr9
    i wszystko będzie w porządku.
    • 30: CommentAuthorlzd
    • CommentTime19 Nov 2023 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 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
     

    George:

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

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

    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
     
    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
     
    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
     
    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 zmieniony
     
    proszę rozwiń skrót JSR George, oraz JMP ...

    rozumiesz co piszesz czy przyjmujesz wszystko na wiarę?
    • 38:
       
      CommentAuthorGeorge
    • CommentTime20 Nov 2023
     
    Tak, staram się rozumieć, co piszę.
    Tak, umiem rozwinąć.
    Można prosić o konstruktywny komentarz?
    • 39:
       
      CommentAuthorjhusak
    • CommentTime20 Nov 2023
     
    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
     
    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
     
    @Cosi - W punkt!