atarionline.pl MADS - propozycja nowej funkcji - 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: CommentAuthorilmenit
      • CommentTime27 Feb 2013 12:02 zmieniony
       
      Hej,

      Gdy potrzebujemy wydajnej obsługi grafiki warto zrobić liniowy dostęp do pamięci ekranu tak, aby każda linia ekranu zaczynała się od nowej strony. Wtedy możemy robić super szybkie STA linia,Y.
      Zależnie od trybu graficznego przy takiej organizacji pamięci pozostaje na każdej stronie sporo miejsca do wykorzystania. O ile nie jest problemem, gdy wrzucamy tam dodatkowe dane, fajnie, gdyby można było tam wrzucić też kod.
      Można to zrobić ręcznie na przykład za pomocą MADSowego .PAGES oraz ORG, ale jest to bardzo uciążliwe dla większego projektu np. gdybyśmy chcieli pracować z liniowym hiresem 320x200.

      No i tu pomysł, który mógłby przenieść MADSa na jeszcze wyższy poziom abstrakcji, zbliżony do języków wysokiego poziomu.

      MADS umożliwia tworzenie kodu relokowalnego, więc może dałoby radę wrzucać określony kod na strony pamięci za przydzieloną im pamięcią graficzną (lub inną predefiniowaną), wszędzie tam, gdzie jest miejsce?

      Wymagałoby to oczywiście auto-korekcji kodu, który nie mieściłby się w granicy strony za pomocą trampolin JMP. Ponieważ kod taki byłby mniej wydajny konieczne byłoby oznaczanie go specjalnym znacznikiem.

      BARDZO pomogłoby to również twórcom kompilatorów języków wysokopoziomowych opartych na MADS takich jak Atalan czy Effectus.

      Co myślicie?
      • 2:
         
        CommentAuthorpirx
      • CommentTime27 Feb 2013 13:02
       
      pomysł jest super fajny, widzę mnóstwo miejsc, w których mógłby się przydać - resztki po sprajtach, fontach, grafice, etc.

      Pytanie inne - w jakim przypadku taki tryb graficzny (z ładowaniem adresu przez antica w każdym wierszu) jest opłacalny, biorąc pod uwagę, że w ten sposób zje się ~1/4(?) czasu procka.
      • 3: CommentAuthor0xF
      • CommentTime27 Feb 2013 14:02
       
      Chybiony pomysł. Szatkowac cały kod żeby oszczędzić pojedyncze cykle na stawianiu pikseli? Pomyśl lepiej o innych optymalizacjach.
      • 4:
         
        CommentAuthormgr_inz_rafal
      • CommentTime27 Feb 2013 15:02 zmieniony
       

      pirx:

      pomysł jest super fajny

      0xF:

      Chybiony pomysł
      W takim razie ja jeste za a nawet przeciw :)
      • 5: CommentAuthormono
      • CommentTime27 Feb 2013 15:02 zmieniony
       
      IMHO fajnie byłoby gdyby w madsie można było definiować sobie sekcje, których umieszczenie w pamięci i rozmiar określałoby się wyrażeniem. Przykładowo:
      .sect zpg
      v1 .ds 1
      v2 .ds 2
      .ends

      .sect ram
      procedurka:
      ... ;cos robimy
      rts
      .ends

      .sect zpg
      v10 .ds 20
      .ends

      i niech sobie MADS poklei kawałki i ewentualnie pokaże błąd jak przekroczymy rozmiar sekcji. Albo jak nie da się umieścić kawałka kodu w żądanej sekcji.
      A sekcje można by np. definiować:
      zpg     .defsect start=$0 size=$100
      stack .defsect start=$100 size=$100
      ram .defsect start=$2000 end=$bfff
      scr .defsect start=(@ & $f000) size=$1000
      dl .defsect start=(@ & $fc00) size=$400
      xram .defsect start=$4000 size=$4000
      chr128 .defsect start=(@ & $fc00) size=$400
      chr64 .defsect start=(@ & $fe00) size=$200
      pmg1 .defsect start=(@ & $f800) size=$800
      pmg2 .defsect start=(@ & $fc00) size=$400
      romram .defsect start=$c000 end=$cfff
      romram .defsect start=$d800 end=$ffff
      io .defsect start=$d000 end=$d7ff
      testrom .defsect start=$5000 end=$57ff
      devrom .defsect start=$d800 end=$dfff

      Coś w tym stylu.
      @ to symbolicznie adres. Trzeba by pomyśleć nad rozsądną składnią pozwalającą definiować obszary tak, żeby od reguły można było tworzyć wyjątki (romram obszar $c000..$ffff z dziurą na io).
      Taki mechanizm miałem (w postaci wbudowanych sekcji) w asm KEIL Electronics do 51 i pisało mi się w tym bardzo wygodnie.
      A to myślę zaspokoiło by też (przynajmniej częściowo) ilmenita :)

      Edit: Oczywiście kwestia do rozstrzygnięcia jak rozmieszczać bloki przy sekcjach nakładających się.

      Edit 2: pmg może nawet tak:
      pmg1    .defsect start=(@ & $f800 + $300) size=$500
      pmg2 .defsect start=(@ & $fc00 + $180) size=$280
      • 6: CommentAuthorilmenit
      • CommentTime27 Feb 2013 15:02
       
      Jest to dosyć zbliżone do tego, co jest w CC65:
      ->link<-
      • 7: CommentAuthorKonop
      • CommentTime27 Feb 2013 17:02
       
      @mono: Mads wspiera już od jakiegoś czasu funkcjonalności segmentów.
      Sprawdź dokumentację pod kątem nastepujących dyrektyw: .SEGDEF, .SEGMENT, .ENDSEG.
      • 8: CommentAuthormono
      • CommentTime28 Feb 2013 01:02
       
      @Konop: Dzięki. Przeoczyłem :/
      • 9: CommentAuthormono
      • CommentTime4 Mar 2013 17:03 zmieniony
       
      Ok. .SEGDEF, .SEGMENT i .ENDSEG działają świetnie przy generowaniu tradycyjnej binarki (dla DOSów zgodnych z 2.x). Deklaruję sobie coś takiego:
      .segdef zpg $80 $80
      .segdef ram $2000 $8000

      i teraz spokojnie mogę się dowolnie przełączać między blokami w kodzie za pomocą .SEGMENT/.ENDSEG. Umożliwia mi to pisanie kodu rozproszonego na wiele plików (np. biblioteki) i wykorzystanie ich w projekcie bez konieczności przypisywania adresów procedurom i rejestrom na zpg. MADS to wszystko ładnie porozmieszcza sam.

      A czy da się w MADSie robić coś takiego ale dla binarki SDX (chodzi o bloki typu RELOC, EMPTY i SPARTA)? Chciałbym móc np. zdeklarować coś w tym stylu:
      .segdef zpg $80 $80   ;górna połówka zpg
      .segdef main reloc ;blok relokowalny o nieznanym rozmiarze
      .segdef work empty ;blok rezerowany na dane o nieznanym rozmiarze
      .segdef data empty $100 ;blok rezerowany na dane o określonym z góry rozmiarze
      .segdef init sparta $600 $100 ;blok stały $100 bajtów od $600

      i teraz przełączać się między nimi w kodzie np. tak:
      .segment init
      sec
      ror
      bit *-1
      rol
      rts

      .segment zpg
      adr1 .ds 2
      adr2 .ds 2

      .segment main
      ldy #0
      @ lda (adr1),y
      sta (adr2),y
      iny
      bne @-
      rts

      .segment work
      cos .ds 1

      .segment main
      lda cos
      pha
      ...
      pla
      sta cos
      rts

      i niechby MADS zrobił z tego 1 blok RELOC, 1 blok SPARTA i 1 blok EMPTY. Blok zpg ma za zadanie jedynie przypisać dynamicznie adresy zmiennym na zpg i nie generować żadnego bloku w pliku dla SDX (empty robi to samo, lecz generuje blok EMPTY w binarce).
      Wiadomo, że SDX ma ograniczenie do 7 bloków relokowalnych dlatego chciałbym właśnie móc deklarować segmenty w takich blokach tak, żeby MADS łączył zawartość segmentów w ramach konkretnych bloków.
      Rozmiar bloku work byłby przez MADSa obliczany i na tej podstawie generowany byłby odpowiedni nagłówek EMPTY w binarce.
      Obecnie mogę chyba tylko używać dyrektywy BLK, która porobi mi oddzielne bloki w pliku :/

      Edit: Mocno ułatwiłoby to pisanie kodu bibliotek i używanie ich w projektach dla SDX.
      • 10: CommentAuthorbrx
      • CommentTime9 Mar 2013 00:03
       
      Tak przy okazji... Mam taki problem i nie za bardzo wiem, jak go najlepiej rozwiązać, a "ręcznie" jest to bardzo kłopotliwe. Mam nadzieję, że się wyrażę w miarę jasno.

      Czy istnieje jakiś prosty sposób na rezerwację w kodzie bloku na kod lub dane, który będzie miał określoną długość, nie będzie można jej przekroczyć, a wolne miejsce zostanie wypełnione np. zerami?

      Kombinowanie z pages wespół z align i org - nie do końca to mi idealnie wychodzi, a te segmenty to albo jakiś wyższy poziom abstrakcji, albo kompletnie nie umiem i nie rozumiem... Miałby ktoś może jakiś pomysł?
      • 11: CommentAuthortebe
      • CommentTime9 Mar 2013 10:03
       
      może .DS liczba_bajtów
      • 12: CommentAuthorbrx
      • CommentTime9 Mar 2013 18:03
       
      DS jest bardzo użyteczny, ale tu mi na nic, bo rezerwuje pustą przestrzeń, ale nie z zawartością w postaci kodu do asembleracji czy danych. No nic, poradziłem sobie org-ami + pages + parę kontrolnych printów sprawdzających długość danych, trzeba będzie jeszcze czyścić tę pamięć przed ini - ale paskudnie to wygląda...
      • 13: CommentAuthortebe
      • CommentTime9 Mar 2013 18:03
       
      można trzymać w pamięci wiele procek, które będą asemblowane pod konkretny adres, np.:

      .local prg1, adres_procki
      .endl

      .local prg2, adres_procki
      .endl

      potem taki LOCAL przekopiować pod ADRES_PROCKI