atarionline.pl Assembler - pisanie po ekranie - 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: CommentAuthoriSiek
      • CommentTime3 Dec 2025 22:02
       
      Cześć,

      ja jak zwykle do Was po pomoc.
      Szukam efektywnego sposobu pisania po ekranie w assemblerze na małym Atari (MAD Assembler konkretnie) dla pojedynczego znaku, znaków w pętli i łańcucha tekstowego.

      W jaki sposób Wy to robicie? Używacie rutyn systemowych typu PUTCHAR, PUTLINE albo IOCB0 i wołacie CIO? A może bazgracie bezpośrednio w pamięć ekranu przez SAVMSC lub składacie Display Listę?

      Każdą z tych metod wykorzystuje do różnych celów ale nie wydają mi się być dość optymalne. Może coś podpowiecie, a może macie swoje inne rozwiązania?

      Bardzo dziękuję za każdą wskazówkę.
    1.  

      iSiek:

      Używacie rutyn systemowych typu PUTCHAR, PUTLINE albo IOCB0 i wołacie CIO?
      Nope.

      iSiek:

      A może bazgracie bezpośrednio w pamięć ekranu
      Tak, dokładnie! Używam LDA/STA. Jest to bardzo optymalne.

      iSiek:

      składacie Display Listę?
      Tak, DL jest konieczna.
      • 3: CommentAuthorascrnet
      • CommentTime3 Dec 2025 23:30
       
      Wszystko zależy od programu, który zamierzasz wykonać, czy to dla całej rodziny 8Bits, czy tylko dla XL/XE.

      Oto przykład, jak to robię w MADS, używając procedury drukowania ciągów tekstowych kompatybilnych z rodziną 8btis.
      ->link<-
      • 4:
         
        CommentAuthorpirx
      • CommentTime4 Dec 2025 02:45
       
      najefektywniej to nie pisac po ekranie, ale ustawić adres w DL na gotowe dane. to wcale nie takie głupie, jakby się wydawało - np. w scorchu cały sklepik z broniami tak jest zrobiony - każda broń ma swój wiersz w pamięci i tylko na DL wskazujemy, który ma się w którym miejscu wyświetlić, dzięki czemu zamiast kopiowac napis kopiujemy tylko 2 bajty.
      • 5: CommentAuthoriSiek
      • CommentTime4 Dec 2025 09:13 zmieniony
       
      Dziękuję za wypowiedzi. Pobawię się trochę w pisanie za pomocą powyższych sugestii aby zobaczyć jak mi one leżą. Macie może gdzieś linki do przykładów, gdzie mógłbym podejrzeć gotowe rozwiązania? Zawsze to łatwiej psuć coś działającego niż zaczynać od zera (choć wtedy więcej się uczę i zapamiętuję).

      @pirx
      Co do DL i wyświetlania tylko konkretnego fragmentu, próbowałem i jeszcze mam z tym problem. Zdefiniowanie DL niby jest jasne (w tej chwili to ANTIC tryb 2 40x24) ale nie umiem wyświetlać tylko fragmentu lub kilku linii. Zazwyczaj wyświetla mi się wszystko albo tylko jedna linia, którą zdefiniowałem.

      Co do SAVMSC i DL, to tworzycie własną listę obrazu i modyfikujecie adres SAVMSC tak by wskazywał na Waszą listę, czy robicie kopię istniejącego SAVMSC i modyfikujecie go?

      @ascrnet
      Ja tylko dla samego Atari XL/XE, na inne 8 bitowce nie próbuję pisać.
      Dziękuje za link, podejrzałem Twój kod i fajne rzeczy można tam sobie podpatrzeć do nauki. Widzę, że zdecydowałeś się wołać CIO ale nie zauważyłem jawnego odwołania do kanału IOCB. Czy to oznacza, że korzystasz z domyślnego dla E: (chyba z automatu jest to IOCB0 i jest otwarty?)

      @Edit: tak to IOCB0, po adresach widzę. Czyli nie trzeba się martwić o otwieranie kanału 0 (E:), bo on zawsze jest otwarty?
      • 6: CommentAuthorascrnet
      • CommentTime4 Dec 2025 13:25
       
      @iSiek Tak, system operacyjny Atari XL/XE pozostawia otwarty dysk E:, aby umieścić dowolny komunikat na ekranie. :)

      Możesz polegać na systemie operacyjnym, aby ponownie wykorzystać procedury i nie robić wszystkiego od podstaw lub tworzyć własne od podstaw, co jest bardzo powszechne w złożonych grach.

      Oto kolejny prosty przykład DL i DLI, w którym definiowany jest ekran do wyświetlania określonych tekstów. ;)
      ->link<-
      • 7: CommentAuthoriSiek
      • CommentTime4 Dec 2025 15:55
       
      @ascrnet
      o świetnie! Przejrzę sobie i ten kod. Dobry do nauki.

      Co do E: to fajnie, że system tym zarządza i odpada kilka spraw związanych z obsługą tego.

      Jeśli chodzi o pisanie gier to raczej na tę chwilę nie jestem zainteresowany. Muszę ogarnąć solidnie podstawy programowania :) Natomiast bardziej interesuje mnie pisanie programów/użytków.

      Rozumiem ideę stworzenia dedykowanych DL dla menu, pod menu itd. itp. Wtedy po wybraniu jakiejś opcji podmieniasz listę i po kłopocie, wszystko cacy. Problemem są jednak funkcje, które czytają sobie coś z pamięci, dyskietki lub kasety a następnie po przetworzeniu tych danych mają być wyświetlane w liniach jako zmienne. To jest coś czego nie potrafię na tę chwilę zrobić. Nie wiem jak wstawić coś zmiennego do fragmentu linii.

      Może tutaj jakoś też pomożecie podratujecie?
      • 8: CommentAuthorascrnet
      • CommentTime4 Dec 2025 17:15
       
      Jeśli masz na myśli zmienne języków wysokiego poziomu, to w asemblerze są to pozycje pamięci zdefiniowane przez użytkownika w celu zapisania lub odczytania jednego lub kilku bajtów.

      Mapowanie ATARI pomoże Ci odkryć, które obszary pamięci są wolne do wykorzystania lub są częścią systemu i do czego są faktycznie używane.

      ->link<-

      Jeśli chcesz obsługiwać jakieś urządzenie zewnętrzne, polecam tę książkę, która wyjaśnia CIO systemu operacyjnego.

      ->link<-
      • 9: CommentAuthoriSiek
      • CommentTime4 Dec 2025 17:58
       
      Dzięki bardzo przyda się.

      Co do wolnych obszarów pamięci to już coś tam wiem. Chodziło mi bardziej o to, że odczytujesz sobie jakąś wartość (jako zmienną) i chcesz ją wyświetlić w linii jak np:

      ODCZYTANO <wartość_ze_zmiennej> WYKONAJ COS

      Wiesz i tu nie wiem jak wypełniać takie luki w tekście, a następnie je wyświetlić
      • 10: CommentAuthorascrnet
      • CommentTime4 Dec 2025 18:45 zmieniony
       
      @iSiek Widzę, że nadal nie rozumiesz. Oto szybki przykład, jak szybko wydrukować coś na ekranie bez użycia CIO, a raczej czegoś charakterystycznego dla systemu operacyjnego XL/XE.


      org $2000

      start
      lda #0
      sta 710
      lda #15
      sta 709
      ldx # < text
      ldy # > text
      jsr $c642
      loop
      jmp *

      text
      dta c"Hello World",$9b

      run start


      Na ekranie wyświetlana jest wartość zawarta w etykiecie TEXT. $c642 jest procedurą systemu operacyjnego. :)

      Zapomniałem podczas składania użyć mads hello.asm -o:hello.xex -l:hello.lst i sprawdzić hello.lst, aby zobaczyć, jak składane są bajty.
      • 11: CommentAuthoriSiek
      • CommentTime4 Dec 2025 19:49
       
      Dobra, to pozwól mi wykorzystać Twój przykład aby zobrazować o co mi dokładnie chodzi :)
      To co pokazałeś na górze, znam i umiem, a chodzi mi o:

      Masz sobie jakąś zmienną, powiedzmy ZMIENNA equ $0080
      Wykonujesz jakieś operację w swoim programie i ta zmienna przyjmuje jakąś wartość np. 05
      Wywołujesz pisanie tekstu i pojawia Ci się na ekranie:

      "Hello 05 World"

      Dalej program działa i wykonujesz jakieś operacje a zmienna ma wartość AB i znowu wyświetlasz tekst:

      "Hello AB World"

      Chodzi mi zatem o to w jaki sposób do zdefiniowanego wiersza z tekstem wstawić jakąś zmienna wartość?
      • 12: CommentAuthorwoj76
      • CommentTime4 Dec 2025 20:58
       
      Formatowanie liczb nie jest niestety częścią systemu operacyjnego, musisz niestety napisać sobie do tego kod, albo podkraść z np. Mad Pascala (piszę w ciemno tutaj, z MP aktywnie nie korzystałem, ale znając tebe to tam to na bank gdzieś jest).
      • 13: CommentAuthoriSiek
      • CommentTime4 Dec 2025 21:07
       
      Taki kod mam, opracowałem sobie. Cała idea i pytanie to jak w string "Hello World" wstrzyknąć do wyświetlenia coś swojego, jakąś zmienną wartość? :)
      • 14: CommentAuthorj_g
      • CommentTime4 Dec 2025 22:48
       
      To wszystko bardzo zależy. To zależy od tego Twojego kodu/podejścia. Jeśli masz ten kod to go pokaż, to pewnie ktoś pomoże. Np. jakby ten kod miał wyglądać tak jak powyżej, z wykorzystaniem tej procedury systemowej, to musiałbyś wywołać ją trzy razy, wskazując za każdym razem na adresy pamięci z początkiem poszczególnych ciągów, adres wskazujący na początek 'Hello ', potem na ZMIENNA, potem wypisać znak spacji, a potem musiałbyś mieć adres pamięci wskazujący na początek ciągu 'world' (najlepiej od razu ' world') (w przykładzie go nie masz określonego nazwą, musiałbyś se policzyć, albo określić z wykorzystaniem drugiego equ) i znów wywołać tę procedurę.

      BTW. Co innego 05 i AB w pamięci (po 1 bajcie), a co innego ciąg dwóch znaków atascii '05' czy 'AB' do wyświetlenia, po dwa bajty każdy (np. znak 'A' to wartość 41 w pamięci (szesnastkowo)).
      • 15: CommentAuthorascrnet
      • CommentTime4 Dec 2025 23:08 zmieniony
       
      @iSiek Polecam przeczytanie tej książki, ponieważ wyjaśnia ona od podstaw asembler, zwłaszcza pojęcia, matematykę, logikę i wiele innych zagadnień.

      https://www.atariarchives.org/roots/

      Teraz zmiana litery w czasie wykonywania jest łatwa, kolejny przykład:

      org $80

      var1
      dta c'h'

      org $2000

      start
      lda #0
      sta 710
      lda #15
      sta 709
      ;
      lda var1
      sta text
      lda #'w'
      sta text+6
      ;
      ldx # < text
      ldy # > text
      jsr $c642
      loop
      jmp *

      text
      dta c"Hello World",$9b

      run start


      Mam nadzieję, że ten przykład wyjaśni Ci podstawy. :)

      PS: zadanie domowe: zrobić to dla większej liczby znaków. xD
      • 16: CommentAuthorzbyti
      • CommentTime4 Dec 2025 23:16
       
      @ascrnet szargasz Atarowskie świętości, popraw się :]
      • 17: CommentAuthortebe
      • CommentTime5 Dec 2025 00:30
       
      przykład ascrnet-a to przykład jak tego nie robić

      wystarczy wybrać Altirra -> System -> Configure System... -> Operating System -> Altirra OS 3.44

      i przykład użycia stałych skoków do OS pójdzie w krzaki

      jeśli skorzystacz z IOCB zadziała na każdym OS-ie, co ma niebagatelne znaczenie kiedy chcesz tworzyć programy narzędziowe

      podstawy tutaj
      ->link<-
      • 18: CommentAuthorzbyti
      • CommentTime5 Dec 2025 00:36
       
      @tebe psujesz zabawę... powinieneś był napisać, że za "jsr $c642" na party każą mu zjeść norweskiego kiszonego śledzia ;)
      • 19: CommentAuthorascrnet
      • CommentTime5 Dec 2025 00:56
       
      Ależ oni są dramatyczni!!! xD

      Nie jest to nic złego, ale dotyczy wyłącznie systemów OS XL i XE. Oczywiście ogranicza to kompatybilność, ale to już inna kwestia.

      wersja bardziej kompatybilna :)


      ICCOM = $342
      ICBAL = $344
      ICBLL = $348
      CPUTREC = $9

      CIOV = $E456
      SETVBV = $E45C

      org $80

      var1
      dta c'h'

      org $2000

      start
      lda #0
      sta 710
      lda #15
      sta 709
      ;
      lda var1
      sta text
      lda #'w'
      sta text+6
      ;
      jsr print
      loop
      jmp *

      print
      ldx #$0
      mva #CPUTREC ICCOM,x
      mwa #text ICBAL,x
      mwa #$A0 ICBLL,x
      jsr CIOV
      rts

      text
      dta c"Hello World",$9b

      run start
      • 20: CommentAuthorzbyti
      • CommentTime5 Dec 2025 01:03
       
      @ascrnet jedzenie kiszonych śledzi to też nic złego :]
      • 21: CommentAuthorzbyti
      • CommentTime5 Dec 2025 01:13
       
      @ascrnet a tak na poważnie, wiesz, że widać, że kod wkleił ktoś kto go nie rozumie?
      • 22: CommentAuthoriSiek
      • CommentTime5 Dec 2025 09:13
       
      Dobra, dzięki wielkie wszystkim!
      Potrawie sobie to przez chwilę, bo wydaje mi się, że coś więcej już z tego rozumiem :)

      Czyli operację wykonujemy na komórkach pamięci, w których mam zawarty oryginalny tekst i tam wstrzykujemy, podmieniamy, modyfikujemy zawartość a następnie wywołujemy procedurę pisania tekstu. Przez taki zabieg otrzymujemy efekt, o który pytałem. To teraz czas się tym pobawić i zobaczyć jak mi pójdzie.

      @zbyti
      Ja śledzie bardzo lubię, to może i odważę się skosztować kiszonego ;D

      @j_g
      Proszę oto kod wyświetlający hex na ekranie jako tekst. Oczywiście kod nie jest ani optymalny, ani nie przestrzega najlepszych praktyk. Służy do nauki pisania i sprawdzania, czy działa. Czas na pisanie dobrego kodu jeszcze kiedyś nadejdzie ;) Teraz pisze bo pisze i ma działać, tak więc musicie mocno przymknąć oczy czytając go ;) (w tym konkretnym przypadku nawet już wiem co i jak bym poprawił)


      org $0600

      SAVX equ $00
      SAVY equ $01

      bufor equ $f2b0

      OUTCHAR equ $f2b0

      DVAL equ 48
      LVAL equ 55

      ldx #0

      petla
      lda bufor,x

      jsr PrintMemHex

      inx
      cpx #2

      bcc petla

      jmp *


      .proc HexHiNibble
      lsr
      lsr
      lsr
      lsr

      cmp #10
      bpl litera

      ;cyfra
      clc
      adc #DVAL

      jmp koniec

      litera:
      clc
      adc #LVAL

      koniec:

      stx SAVX
      sty SAVY

      jsr OUTCHAR

      ldx SAVX
      ldy SAVY

      rts

      .endp


      .proc HexLoNibble
      and #$0f
      cmp #10

      bpl litera

      ;cyfra
      clc
      adc #DVAL
      jmp koniec2

      litera:
      clc
      adc #LVAL

      koniec2:

      stx SAVX
      sty SAVY

      jsr OUTCHAR

      ldx SAVX
      ldy SAVY

      rts

      .endp


      .proc PrintMemHex
      pha
      jsr HexHiNibble

      pla
      jsr HexLoNibble
      rts

      .endp
      • 23: CommentAuthorascrnet
      • CommentTime5 Dec 2025 13:31
       
      @iSiek Kontynuuj naukę, nikt nie rodzi się potrafiąc od razu tworzyć idealny kod, zawsze istnieje krzywa uczenia się. :)
      • 24: CommentAuthoriSiek
      • CommentTime5 Dec 2025 15:34
       
      @ascrnet oczywiście będę. Dziękuje za wszystkie wskazówki.
      • 25: CommentAuthorgregor2
      • CommentTime5 Dec 2025 16:26 zmieniony
       
      Jesli piszesz program uzytkowy to ja zaproponuje Ci nieco inna metode.
      Zaleta jej jest to ze dzieki minimalnej modyfikacji twoj program moznaby uruchomic nie tylko na Atari , ale takze na Commodore, AppleI i AppleII , KIM-1 i wielu,wielu innych ;)
      Co finalnie moze dac Ci znacznie wiecej potencjalnych nabywcow jak i $$$ ;)
      Procedure mozna takze skrucic usuwajac
      BNE SKIP
      INC PRINTCHAR+2

      jesli umiescimy ja tak ze bufor nigdy nie przekroczy granicy strony.
      Jesli znajdzie sie na jej poczatku to ciag moze miec do 255 znakow
      Wydruk ciagu nastepuje po dodaniu kodu CR ($0d) jak to jest w profesjonalnych komputerach.
      Dodalem jescze stara z lat 70' metode konversji BIN do ASCII wykozystujacej dzialanie na liczbach BCD, ktora jest szybka i mala ;)
      Ja pisze na AppleII asemblerach wiec byc moze bedziesz musial nieco dostosowa skladnie dla Atari.
      ;***************************************************************************************************
      ;* PROGRAM TWORZY CIAG TEKSTOWY *
      ;* JSR PRINTCHAR DODAJE ZNAK ASCII W ACC DO CIAGU *
      ;* JSR PRINTASCII DODAJE KOD ASCII WAROSCI W ACC *
      ;* WYWOLAIE PRINTCHAR Z ACC=$0D "CR" POWODUJE WYDRUK NA EKRANIE I PRZYWROCENIE BUFFORA NA POCZATEK *
      ;* JSR INIT WYWOLAC RAZ NA POCZATKU DO USTAWIENIA BUFORA
      ;***************************************************************************************************
      *=$1000

      ; JSR INIT
      ; LDA #'A'
      ; JSR PRINTCHAR
      ; BRK


      INIT:
      LDX #>buf
      LDY #<buf
      STX PRINTC+2
      STY PRINTC+1
      RTS
      PRINTASCII:
      PHA
      LSR
      LSR
      LSR
      LSR
      JSR BIN2ASCII
      JSR PRINTCHAR
      PLA
      JSR BIN2ASCII
      PRINTCHAR:
      CMP #$0D
      BNE PRINTC
      LDA #$9B
      CMP #$9B
      PRINTC:
      STA BUF
      BEQ PRINT
      INC PRINTC+1
      BNE SKIP
      INC PRINTC+2
      SKIP:
      RTS
      PRINT:
      LDX #>buf
      LDY #<buf
      STX PRINTC+2
      STY PRINTC+1
      JMP $C642
      BIN2ASCII:
      CLC
      SED
      ADC #$90
      ADC #$40
      CLD
      RTS
      BUF:
      .db 0,0

      • 26: CommentAuthoriSiek
      • CommentTime5 Dec 2025 16:41
       
      @gregor2 Śliczne dzięki! Również przejrzę i pouczę się z tego
    2.  
      iSiek,
      Sprawdź sobie w Internecie lekcje wideo prowadzone przez Larka (kanał "larkadiusz"). Cykl "Piszemy Grę" wyjaśnia w sposób przystępny wszelkie zawiłości podstaw programowania na Atari, między innymi pisanie po ekranie. Dzięki temu, że kurs ciągle trwa masz realne szanse aby wpływać na jego kształt poprzez aktywne uczestnictwo.
      • 28: CommentAuthoriSiek
      • CommentTime5 Dec 2025 16:53
       
      @mgr_inz_rafal O, i to jest równie bardzo dobra informacja dla mnie. Dziękuje
      • 29: CommentAuthorgregor2
      • CommentTime5 Dec 2025 16:55 zmieniony
       
      W moim kodzie byl maly blad juz poprawilem. ;)
      A jeszcze mala uwaga nie musisz wywolywac INIT, wlasciwie jest ono dodane tylko dla AppleII i to tylko aby uniknac bledu gdyby program byl wczesniej przerwany przez RESET i ponownie wywolany.
      Ale chyba i w wypadku Reset na Atari dzialaloby to podobnie.
      • 30: CommentAuthoriSiek
      • CommentTime5 Dec 2025 18:08
       
      Rozumiem, dziękuję @gregor2

      A jeszcze skorzystam z chwili uwagi, skoro ją tutaj mam.

      W jak sposób optymalnie i oszczędnie wywoływać jakąś procedurę do wypisywania tylko jednego znaku na ekranie? I jak coś takiego wykorzystać w pętli do wypisywania znaków dostarczanych pojedynczo?

      Gdy używam systemowego PUTCHR = $f2b0 to on działa idealnie ale niszczy rejestry X i Y więc przed każdym wywołaniem trzeba je zabezpieczyć, a potem przywrócić. Może jest jakiś inny bardziej efektowny i tańszy sposób na umieszczanie znaków na ekranie? :)
      • 31: CommentAuthorascrnet
      • CommentTime5 Dec 2025 18:26 zmieniony
       
      Gdy używam systemowego PUTCHR = $f2b0 to on działa idealnie ale niszczy rejestry X i Y więc przed każdym wywołaniem trzeba je zabezpieczyć, a potem przywrócić. Może jest jakiś inny bardziej efektowny i tańszy sposób na umieszczanie znaków na ekranie?


      jeśli istnieje inny sposób przy użyciu SAVMSC, szybki przykład:

      SAVMSC = $58

      org $600

      start
      lda #"A"
      ldy #10
      sta (SAVMSC),y
      jmp *

      run start
      • 32: CommentAuthoriSiek
      • CommentTime5 Dec 2025 19:07 zmieniony
       
      Ok, super. A jak kontrolować długość wiersza?

      adc #(pozostałe znaki do 40)?


      A moze wydrukować znak $9b ?
      • 33: CommentAuthorascrnet
      • CommentTime5 Dec 2025 19:32
       
      @iSiek Ta pozycja SAVMSC jest najniższą pamięcią ekranu „zobacz mapowanie atari”

      drukując 40 znaków, kontrolowanych przez rejestr y.

      SAVMSC = $58

      org $600

      start

      ldy #0
      loop
      lda #"A"
      sta (SAVMSC),y
      iny
      cpy #40
      bne loop
      jmp *

      run start
      • 34: CommentAuthoriSiek
      • CommentTime7 Dec 2025 21:13
       
      @ascrnet i dobra, dziękuje pobawiłem się, działa. Fajnie.
      Nawet odkryłem, że 8 bitów na Y to mało aby zapisać cały ekran i SAVMSC+1 trzeba dotknąć :) Szkoda tylko, że w tym trybie LMARGIN/RMARGIN nie są akceptowane i trzeba przesuwać kursor przez modyfikację wartości Y

      Tak więc nie ma idealnej metody do pisania. Każda ma swoje wady i zalety ale pewnie z czasem będę wiedział, która kiedy zastosować. Dziękuję
      • 35: CommentAuthorzbyti
      • CommentTime7 Dec 2025 22:13 zmieniony
       
      ->link<-

      polecam jako ćwiczenie.

      mój wynik to 73 bajty (XEX 79 bajtów z 6 bajtowym nagłówkiem) - przy założeniu (moim a nie konkursowym), że musi pójść na każdym Atari.

      parę lat nie pisałem w ASM 6502, a nigdy nic w nim poważnego nie zrobiłem :] do tego pisałem zazwyczaj w K65.

      próba zejścia do jak najmniejszej ilości bajtów (w tym zadaniu) odświeżyła mi wiedzę ;)
      • 36: CommentAuthoriSiek
      • CommentTime7 Dec 2025 22:39
       
      @zbyti Dokładnie dlatego ćwiczyć zacząłem "pisanie po ekranie" :) Też pod tym kątem, bo chciałem się zgłosić. Mój najoptymalniejszy kod brutto to 102 bajty :/ Staram się zejść niżej. Pomysłów sporo ale umiejętności brak. Najbardziej wykańcza mnie kosztowo pisanie znaków :|
      • 37: CommentAuthorzbyti
      • CommentTime7 Dec 2025 22:56 zmieniony
       
      @iSiek moje pierwsze podejście to 120 bajtów, ale 2 dni później 79 :] trenuj ;)

      podane wyżej wartości zawierają 6-bajtowy nagłówek DOS w pliku XEX więc sam kod to -6.
      • 38: CommentAuthorascrnet
      • CommentTime7 Dec 2025 22:59
       
      @iSiek Są to dwa bajty do obsługi pełnego ekranu. Marginesy można skonfigurować za pomocą:

      LMARGN = $52
      RMARGN = $53

      Są one przeznaczone wyłącznie dla grafiki 0. :)
      • 39: CommentAuthoriSiek
      • CommentTime7 Dec 2025 23:07
       
      @zbyti Tak wiem, ze 6 bajtow ma XEX, i mam dodatkowo 3 bajty na jmp * które tez bezposrednio nie bierze udziału w tworzeniu platka śniegu ale nie pociesza mnie to bardzo ;) Oczywiście, ze trenuje. Czas na zgłoszenie do Wigilii. Mój kodbstaryowy to bylo 111 bajtow brutto także jak widzisz niewiele udało mi sie zejść niżej.

      @ascrnet Tak, znam je i używam przy PUTCHAR ale zwykle SAVMSC je ignoruje i trzeba offset na Y stosować, co powoduje dodatkowy koszt :/

      Nic, pomysły sa ale na te chwile utknąłem. Jutro kolejny dzień i kolejne implementacje :)
      • 40: CommentAuthorzbyti
      • CommentTime7 Dec 2025 23:15 zmieniony
       
      z tipów:

      `jmp *` można zmienić na np. `bne *` w zależności od flag procesora.

      całość kodu można przenieść na ZP (`org $80`)

      do tego trzeba odnaleźć algorytm rysowania płatka, który dobrze się implementuje na 6502 ;)
      • 41: CommentAuthoriSiek
      • CommentTime8 Dec 2025 08:01
       
      @zbyti ja to dokladnie wszystko robie od samego początku:) Algorytmów do rysowania mam 5, każdy inaczej podchodzi do tematu. W zależności, który z nich implementuje to dane płatka mam na 9 do 30 bajtow. Moim największym problemem jest brak wiedzy i umiejętności programistycznych aby napisać to efektywnie, dlatego zainteresował mnie bardzo ten pomysł z wyzwaniem, bo jest idealny do nauki. Co do jmp * czy bne * to mnie nie martwi bo to 1 bajt oszczędności, o którym wiem i AI go mocno forsuje. Gdy zapytałem ChatGPT o pomoc to aż sie załamałem. Okazuje sie, ze ja potrafię wiecej na obecnym etapie niż AI ;)
      • 42: CommentAuthorzbyti
      • CommentTime8 Dec 2025 14:05
       
      @iSiek rozumiem, że dokonałeś oczywistej obserwacji, że ćwiartkę wzoru można zakodować w postaci paru bajtów gdzie "gwizdka" to zapalony bit (1) a jej brak to (0)?

      to, że bajt ma 8 bitów nie jest przeszkodą ;)

      mając taką matrycę dokonujesz tylko odbić względem osi.
      • 43: CommentAuthorzbyti
      • CommentTime8 Dec 2025 14:45
       
      @iSiek dam ci jeszcze jedną podpowiedź ;)

      jak już zdekodujesz bity z matrycy na wzór płatka śniegi to odbicie względem osi Y jest bardzo proste - stos na 6502 jest typu LIFO.
      • 44: CommentAuthoriSiek
      • CommentTime8 Dec 2025 15:21
       
      @zbyti A widzisz, w ten sposób! A ja drugą pętle RORem robiłem ;)
      • 45: CommentAuthorzbyti
      • CommentTime8 Dec 2025 15:53 zmieniony
       
      @iSiek no to jeszcze jedna i ostatnia podpowiedź dzięki której przynajmniej zrównasz się wielkością kodu z moim ;)

      bajt ma co prawda 8 bitów, ale w tym przypadku możemy 9 bit zakodować w taki sposób:

      ; sztuczka
      sec
      draw_x rol snowflake,x
      • 46: CommentAuthoriSiek
      • CommentTime8 Dec 2025 17:09
       
      OO, no fakt! Zrezygnowałem z CLC ale nie wpadłem na pomysł aby sobie go ustawić!
      Dziękuje. Pokombinuje jeszcze w tym kierunku.
      • 47: CommentAuthorzbyti
      • CommentTime9 Dec 2025 14:59
       
      @iSiek jeżeli gwiazdka to 0 a jej brak to 1 to możesz śmiało korzystać z CLC ;P
      • 48: CommentAuthoriSiek
      • CommentTime9 Dec 2025 15:16
       
      No wlasnie nie, bo miałem odwrotnie :P
      Teraz próbuje inna metoda, dzieki @zbyti
      • 49: CommentAuthorzbyti
      • CommentTime9 Dec 2025 15:19 zmieniony
       
      uważam, że moja metoda jest optymalna - bo się przez nią nie wyspałem :D

      mój kod można poprawić tylko i wyłącznie rezygnując z kompatybilność z Atari na rzecz konkretnego modelu (modeli? mój kod pójdzie na A400) tego komputera.

      ale próbuj :) bo to droga jest nagrodą w tym przypadku ;) co poćwiczysz to Twoje :]
      • 50: CommentAuthorzbyti
      • CommentTime9 Dec 2025 15:33 zmieniony
       
      To moje (poniżej) pierwsze podejście (zoptymalizowane ale już nieaktualne) po czym "przyśniło mi się" odbicie Y przez stos :D i zszedłem jeszcze kilka bajtów pisząc algorytm od nowa.

      ;--------------------------------------

      opt f-h+

      ;--------------------------------------

      SAVMSC EQU $58 ;2-byte saved address

      ;--------------------------------------

      asterix = 10

      op_ror = $6a
      op_rol = $2a
      op_lsr = $4a
      op_inc = $e6
      op_dec = $c6

      ;counter = $5A ; OLDROW
      ;OLDCOL = $5B ; OLDCOL 2 bytes


      ;--------------------------------------

      org $80

      ldx #18

      draw_y ldy #17
      row lda snowflake
      pha

      sec
      draw_x rol
      bcc @+

      pha
      mva #asterix (SAVMSC),y
      pla

      cpy #9
      bne @+
      mva #op_lsr draw_x
      pla

      @ dey
      bpl draw_x

      cpx #9
      bne @+

      iny
      mva #asterix (SAVMSC),y
      ldy #18
      sta (SAVMSC),y

      mva #op_dec incdec

      @ adw SAVMSC #40
      mva #op_rol draw_x
      incdec inc row+1

      dex
      bpl draw_y

      bne *

      ;--------------------------------------

      snowflake dta %00000000 ; 0
      dta %00000010 ; 1
      dta %01010001 ; 2
      dta %00110000 ; 3
      dta %01110010 ; 4
      dta %00001001 ; 5
      dta %00000100 ; 6
      dta %10010010 ; 7
      dta %01001001 ; 8
      dta %11111111 ; 9

      ;--------------------------------------