atarionline.pl MADS - problem z kontekstem (zasięgiem etykiet) - 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: CommentAuthorarctus
      • CommentTime15 Mar 2025 20:03 (7 dni temu) zmieniony
       
      Napotkałem pewien problem, który wydaje mi się być błędem madsa. Mianowicie, poniższy kawałek kodu:

      org $2000

      DIRECTION .enum
      LEFT = 0
      RIGTH
      .end

      main
      jmp start

      object .local

      init
      mva #DIRECTION.RIGTH direction
      rts

      direction
      dta $00

      .end

      start
      jsr object.init

      stop
      jmp stop


      generuje błąd:
      mads test.asm
      mva #DIRECTION.RIGTH direction
      test.asm (13) ERROR: Could not use DIRECTION in this context

      Zmiana wskazanej linii na
      mva #:DIRECTION.RIGTH direction

      nic nie wnosi i też powoduje wskazany wyżej błąd.

      Wywołanie madsa z parametrem -c tylko pozornie rozwiązuje problem.

      Chciałbym też zwrócić uwagę, że w tym konkretnym przypadku komunikat błędu nie jest precyzyjny. Sugeruje, iż to typ wyliczeniowy DIRECTION jest poza kontekstem nie zaś direction. Być może tutaj najprostszym(?) rozwiązaniem byłoby dodanie nowego parametru, do wywołania madsa, blokującego zmianę wielkości liter etykiet w komunikatach błędów?

      EDIT: dodałem formatowanie kodu.
      • 2: CommentAuthorilmenit
      • CommentTime15 Mar 2025 22:03 (7 dni temu)
       
      masz konflikt nazw - używasz direction jako enum i jako label, spróbuj:

      init
      ; mva #DIRECTION.RIGHT direction
      lda #DIRECTION.RIGHT
      sta direction2
      rts

      direction2
      dta $00
      • 3:
         
        CommentAuthorshanti77
      • CommentTime15 Mar 2025 22:03 (7 dni temu)
       
      Proponuję więcej pisać w asemblerze, a mniej w MADSie i będzie mniej problemów, a kod będzie szybszy.
      • 4: CommentAuthortebe
      • CommentTime15 Mar 2025 22:03 (7 dni temu) zmieniony
       
      jeśli dasz 'direction' przed 'mva #DIRECTION.RIGTH direction' to zadziała

      ale w Twojej oryginalnej wersji assembler rozumie to jako odwołanie do ENUM o nazwie DIRECTION (nie można zapisywać ani odczytywać ENUM_NAME)

      direction
      dta $00


      init
      mva #DIRECTION.RIGTH direction
      rts



      org $2000

      DIRECTION .enum
      LEFT = 0
      RIGTH
      .end

      main
      jmp start

      object .local

      direction
      dta $00


      init
      mva #DIRECTION.RIGTH direction
      rts


      .end

      start
      jsr object.init

      stop
      jmp stop


      a najlepiej podać pełną ścieżkę do etykiety 'object.direction'

      org $2000

      DIRECTION .enum
      LEFT = 0
      RIGTH
      .end

      main
      jmp start

      object .local

      init
      mva #DIRECTION.RIGTH object.direction
      rts

      direction
      dta $00


      .end

      start
      jsr object.init

      stop
      jmp stop
      • 5: CommentAuthorarctus
      • CommentTime16 Mar 2025 00:03 (7 dni temu)
       
      Panowie,

      wielkie dzięki za odpowiedzi.
      Nie mogłem znaleźć w dokumentacji odpowiedzi na nurtujące mnie pytania, stąd mój post i zakwalifikowanie zachowania jako błąd madsa.

      Zanim wylałem swoje żale tutaj, poradziłem sobie dokładnie w sposób jaki zaproponował @tebe, czyli podanie "pełnej ścieżki". Wydawało mi się to jednak trochę nadmiarowe. Skoro jednak taka jest oficjalna wykładnia to nie mam zastrzeżeń :)
      • 6:
         
        CommentAuthorjhusak
      • CommentTime16 Mar 2025 08:03 (7 dni temu)
       
      No i jeszcze case sensitive.
      -c
      Użycie przełącznika -c spowoduje rozróżnianie wielkości liter w nazwach etykiet, zmiennych, stałych. Dyrektywy assemblera i rozkazy CPU 6502, 65816 są zawsze rozpoznawane bez względu na wielkość liter.
      • 7: CommentAuthorvega1
      • CommentTime19 Mar 2025 19:03 (3 dni temu) zmieniony
       
      czy da się jakoś to obejść?

      Etykiety z przypisanym licznikiem banków MADS-a =0 są zasięgu globalnego.
      Etykiety z przypisanym licznikiem banków MADS-a >0 są zasięgu lokalnego.

      potrzebuje, żeby etykiety w bankach MADS-a >0 również były zasięgu globalnego
      korzystam z wielu banków pamięci bo to wersja na kartridż i zmiennych są setki.

      dyrektywa .def :variable ,którą kiedyś używałem dla pojedyńczych zmiennych też coś nie chce działać...
      • 8: CommentAuthortebe
      • CommentTime19 Mar 2025 19:03 (3 dni temu)
       
      zdefiniuj je jako globalne

      ->link<-
      • 9: CommentAuthorvega1
      • CommentTime19 Mar 2025 20:03 (3 dni temu) zmieniony
       
      .def nie działa właśnie..pomimo jej użycia i tak nie widzi takiej zmiennej poza bankiem.znam tą komendę bo już używałem kiedyś ale dla pojedyńczych zmiennych

      a nie da się jakimś przełącznikiem tego załatwić przy asemblacji?
      • 10: CommentAuthortebe
      • CommentTime19 Mar 2025 22:03 (3 dni temu) zmieniony
       
      .def odnosi się do banku #0

      ogólnie z poziomu banku #0 można dostać się do każdej etykiety w każdym banku
      tak samo z każdego innego banku można się dostać do etykiet banku #0

      nie ma natomiast możliwości odczytywania/zapisywania etykiet między bankami >#0

      org $2000

      nop

      lmb #1

      test
      lda temp

      lmb #0

      nop
      temp
      lda test


      jeśli chcesz aby inne banki znały jakiekolwiek adresy z innych banków, umieść te adresy w banku #0

      bank #0 to domyślnie pamięć podstawowa, $0000..$FFFF
      • 11: CommentAuthorvega1
      • CommentTime19 Mar 2025 23:03 (3 dni temu) zmieniony
       
      cyt. "bank #0 to domyślnie pamięć podstawowa, $0000..$FFFF"

      u mnie bank #0 to tylko 16KB $8000..$BFFF bo to wersja tylko cartridżowa gdzie banki mają po 16KB.
      zanim gra się uruchomi to kopiuje z trzech banków do pamięci głównej

      więc zamiast banku #0 z 64KB to mam tylko 16KB...i dlatego brakuje pamięci

      proste usunięcie rozkazów NMB dla 3-pierwszych banków, żeby były jako #0 traktowane......coś gra się sypie
      • 12: CommentAuthortebe
      • CommentTime20 Mar 2025 00:03 (3 dni temu)
       
      może skorzystaj z przełącznika -hm

      wygeneruj plik z etykietami
      • 13: CommentAuthorvega1
      • CommentTime21 Mar 2025 13:03 (1 dzień temu) zmieniony
       
      na razie przerzuciłem kod różnych procedur rysujących z banku #0 do #2. Na szczęście one nie odwołują się wprost do zmiennych z innych banków pamięci. Zwolniło się trochę pamięci...i na jakiś czas starczy....

      w przypadku innych procedur, które korzystają ze zmniennych z innego banku >0...niestety muszą siedzieć one w banku #0.

      a nie ma możliwości dodania do rozkazu OPT jakiejś litery, żeby zmienić zachowanie MADS-a? tzn., że zmienne w bankach >0 są zasięgu globalnego... jeżeli ktoś nie chce to łatwo zastosować dyrektywę .local...co najważniejsze mamy pełną kompatybilność wstecz

      w przypadku umieszczania kodu gry i wielu zmiennych w bankach kartridża >0 to jest problem z przeprowadzeniem assemblacji...
      • 14: CommentAuthortebe
      • CommentTime21 Mar 2025 13:03 (1 dzień temu)
       
      z .LOCAL działa odczyt etykiet z poziomu różnych banków

      org $2000

      nop

      lmb #1

      .local common

      test
      lda :common.temp

      .endl


      lmb #2

      .local common

      nop
      temp

      lda :common.test

      .endl
      • 15: CommentAuthorvega1
      • CommentTime21 Mar 2025 16:03 (1 dzień temu)
       
      to wszystko ok jak mamy kilnaście zmiennych....a jak setki to jest utrudniające
      • 16:
         
        CommentAuthorjhusak
      • CommentTime22 Mar 2025 10:03 (1 dzień temu)
       
      Jak mamy setki zmiennych to oznacza, że projekt jest do poprawki.
      • 17: CommentAuthorvega1
      • CommentTime22 Mar 2025 13:03 (22 godzin temu) zmieniony
       
      komenda .public chyba też nie działa :( szkoda bo tak to MADS daje radę...nawet jak to zajmnie docelowo aż 1,5MB na kartridżu...a przez to jedną cechę mam problem z wykorzystaniem pamięci...jeżeli nakład pracy, żeby to obejść bedzię zbyt duży to raczej projekt zostanie przerwany pewnie...
      • 18: CommentAuthortebe
      • CommentTime22 Mar 2025 15:03 (20 godzin temu) zmieniony
       
      .public .extrn dotyczy .reloc, tak duże projekty dzieliłem zawsze na mniejsze relokowalne części, które łączyłem z głównym programem, albo wrzucałem do kolejnych banków

      przykładem tego jest Pang
      ->link<-
      frm_left.asm do banku: ->link<-
      bonus.asm do banku: ->link<-

      ogólnie najprościej będzie wygenerować plik nagłówkowy dla takiego banku i połączyć taki plik z innym bankiem

      albo każdy bank będzie miał swoją prockę kopiująca pod wskazany adres i główny program kolejno wywołuje tylko te procki w tych bankach

      w Mad Pascal też można umieszczać kod w bankach PORTB i odwoływać się do procedur/funkcji, zmiennych w nich zawartych, jest to ogarnięte właśnie plikami nagłówkowymi, w Mads Assemblerze wymagane jest użycie przełącznika -hm

      p.s.
      pewnie jakiś dodatkowy operator byłby potrzebny aby przełożyć to na adresowanie banku, ale pewnie napiszesz że za dużo poprawiania
      • 19: CommentAuthorvega1
      • CommentTime22 Mar 2025 16:03 (19 godzin temu) zmieniony
       
      tebe jeżeli masz jakiegoś maila to ci wrzucę główny plik tworzonego kartridża w ASM....bo tak ciężko wytłumaczyć..tam będzie widać dlaczego tyle zmiennych..i jak proste to jest w tej chwili..bez kombinowania...i do szczęścia brakuje tylko, żeby zmusić MADS-a aby traktował zmienne ze 127 banków po 16KB jako publiczne...z banku zerowego tak jest

      P.S. do tej pory MADS był idealny ale gry MIKIE czy BUBBLE BOBBLE to znacznie mniejsze korzystanie z pamięci dodatkowej....w sumie drobny problem był ale z GIENEKP ogarneliśmy przy robieniu kartridżowej wersji...tam to mniejsza skala była
      • 20: CommentAuthortebe
      • CommentTime23 Mar 2025 00:03 (11 godzin temu)
       
      email jest
      ->link<-
      ->link<-
      • 21: CommentAuthorvega1
      • CommentTime23 Mar 2025 10:03 (1 godzinę temu)
       
      poszło