atarionline.pl MADS - niekonsekwencje (nic poważnego) - 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: CommentAuthormarok
    • CommentTime6 Jan 2023
     
    Trochę potrzebuję wiedzieć (realnie to, najwyżej może na przyszłość), jak zachowuje się MADS w różnych nietypowych scenariuszach.
    Wnioski zapewne mógłbym zachować dla siebie, ale niektóre przypadki są nie dość intuicyjne (sądzę, że nie tylko dla mnie), więc może warto o nich napisać.

    Sprawa tutaj dotyczy kompilacji kodu z etykietami lokalnymi (w stylu MAE).

    Ten kod po "opt ?+" się kompiluje (a w myśl ogólnej zasady nawet nie powinien)
    local1 ldx #7
    ?lop sta $a000,x
    dex
    l \
    bpl ?lop ; bo to ta sama linia




    Kompilator więc przepuści to "l \" choć to więcej przypadek (choć na pewno żaden błąd), a reguła jest inna.
    Kompilator nie przepuści (w zamian) "l" czy "l equ *+256" (stwierdzenie tak reguły).
    Kompilator nie przepuści również "@ \" (chyba wyjątek od wyjątku).

    Przy czym "@ .echo(@-)" daje znać, że "@" deklaruje etykietę anonimową dobrze, to jednak informacja o etykietach lokalnych typu ?… , jakie poprzedzały to "@", zostaje utracona i nie można z nich już skorzystać (stąd błąd w kompilacji). Jest to przypadek analogiczny do deklaracji etykiety globalnej w kodzie (np. tutaj 1 linię wcześniej).

    Więc, nie można przemieszać etykiet lokalnych z anonimowymi (funkcjonalnie, w roli lokalnych) na jednym obszarze kodu. (Nie ma realnie najmniejszej ku temu też potrzeby, bo stylistycznie się to "gryzie".)

    Regułą w stosowaniu etykiet lokalnych (dla mnie to nowość, choć dla stosujących - na pewno nie) w stylu MAE (?…) jest to, że między odwołaniem do takiej etykiety nie może się zdarzyć pomiędzy, a jej deklaracją, deklaracja etykiety innego typu (głównie chodzi o globalną). Jest to w gruncie rzeczy (intuicyjnie) zrozumiałe ograniczenie (trudne do sensownego obejścia z całą pewnością).

    Analogiczna do tej sytuacja (inaczej sformatowany taki sam kod). W obszarze kodu .local można swobodnie odwoływać się do etykiet globalnych (forma ich zapisu "label:"). (Inny jest oczywiście zapis etykiet lokalnych - bez ? z przodu.)


    Przy okazji zwrócę uwagę na zmianę, która mogła zajść w działaniu odwołań do etykiet anonimowych.
    W związku z czym poniższy schemat (z dokumentacji) może nie być już aktualny (jeśli był wcześniej).
    Chodzi mi o przedostatni rozkaz, który wg. schematu działa inaczej niż rzeczywiście się to kompiluje. (Niby oba ostatnie rozkazy skoku warunkowego odsyłają w to samo miejsce, ale tak nie jest, bo "bne @-" odwołuje się tylko do linijki wyżej.

    @ dex   ---- -------
    bne @+ | -- |
    stx $80 | | |
    @ lda #0 | -- |
    bne @- --- |
    bne @-1 ---------
    • 2: CommentAuthortebe
    • CommentTime7 Jan 2023 zmieniony
     
    bne @-

    nie jest tożsame z

    bne @-1

    2001 CA			@ dex
    2002 D0 02 bne @+
    2004 86 80 stx $80
    2006 A9 00 @ lda #0
    2008 D0 FC bne @-
    200A D0 F5 bne @-1

    jest prawidłowo
    • 3:
       
      CommentAuthorpirx
    • CommentTime7 Jan 2023
     
    o ile rozumiem to marok zwraca uwagę na to, że schemat w instrukcji w tym miejscu ->link<- jest nieprawidłowy.
    • 4: CommentAuthormarok
    • CommentTime7 Jan 2023
     
    @pirx: dokładnie tak, jak napisałeś.

    @tebe: kiedyś faktycznie tak założyłem (pewnie to częsty błąd)

    Wydaje mi się, że MADS przy kompilacji zajmuje się całymi liniami wprowadzanego kodu (ze źródła). Natomiast robi wyjątek dla deklaracji etykiety anonimowej (przerywa analizę całej linii i ją sobie dzieli, albo analizuje ją "w innej kolejności"). Myślę nawet, że może to być wynikiem tych zmian (o ile takie były), jakie zaszły w interpretacji etykiet anonimowych (chodzi o ten przypadek z przykładu w dokumentacji).
    (Tak się złożyło, że te dwie sprawy połączyłem przypadkiem w jednym wpisie, a teraz myślę, że mogą mieć ze sobą coś wspólnego. Traf.)

    Sprawdziłem jeszcze, że MADS przyjmuje konstrukcję i działa to bez zarzutu, także po opt ?+ i umieszoną pomiędzy innymi deklaracjami lokalnymi
    sta ?label:$a000,x
    • 5: CommentAuthormarok
    • CommentTime7 Jan 2023
     
    Bardziej nawet, to chodzi o taki przypadek:
    2001 CA			@ dex
    2002 D0 FE @ bne @-

    Teraz jest tak, ale czy kiedyś mogło to się kompilować
    do postaci:
    2001 CA			@ dex
    2002 D0 FD @ bne @-
    • 6: CommentAuthormarok
    • CommentTime7 Jan 2023
     
    Wątek jest "z lekka" chybiony (dobrałem też niezbyt szczęśliwie tytuł).

    Poniekąd, dopiero przyswajam to, z czym wielu dawno się już zetknęło.

    Przydaje się asemblacja z -t przy korzystaniu z etykiet lokalnych.

    Mnie się udało uzyskać pewnym przypadkiem taki zapis:

    00	2028	LOCAL2
    00 202A 3@
    00 202B 3@.?FFFF

    Co widać, wewnętrznie etykiety anonimowe numerowane są kolejnością wystąpienia. Jednakże, do etykiety 3@.?FFFF nie sposób się odwołać spoza aktualnego obszaru lokalnego (@ inicjuje od siebie nowy obszar lokalny, jakby to była etykieta globalna i ma to także takie konsekwencje).

    Gdy nie było etykiety @ to ta zmienna miała postać: LOKAL2.?FFFF i do niej można było się odwołać spoza aktualnego obszaru lokalnego.

    Tak apropo, że można się odwoływać do zmiennych obszaru lokalnego z zewnątrz, to się spostrzegłem dopiero co, przy okazji zajrzenia do dokumentacji xasm (o -t także stamtąd).

    Tam jest ta różnica, że nie wstawia się "." między wyszczególnieniem obszaru lokalnego a konkretną etykietą z tego obszaru, więc zamiast tego byłoby to LOKAL2?FFFF.

    W Xasm (chyba) zawsze etykiety globalne wyznaczają potencjalne obszary etykiet lokalnych. Nie trzeba tego deklarować (w MADS o tyle też nie, gdy korzystamy z przełącznika ?+, kosztem możliwości odwołań do etykiet tymczasowych).

    W MADS znak ? może znajdować się na równych prawach z innymi w nazwie etykiety, stąd konieczność bardziej złożonego zapisu (z kropką).

    Do kompletu dadać się powinno, że deklaracje etykiet globalnych w obszarze lokalnym nie są nigdy konieczne, ponieważ można je zastąpić deklaracjami etykiet lokalnych, a te (jak się okazuje) są dostępne z każdego miejsca.
    • 7:
       
      CommentAuthorjhusak
    • CommentTime9 Feb 2023
     
    Napotkałem na niekonsekwencję:

    mads manual:

    Dyrektywa .DEFINE pozwala zdefiniować jedno-liniowe makro MACRO_NAME. Dopuszczalnych jest dziewięć parametrów %%1.%%9 (:1..:9) reprezentowanych w ten sam sposób jak dla makr .MACRO, poprzez znaki '%%' lub znak ':'. Nazwy literowe parametrów nie są akceptowane, nie ma możliwości użycia znaku podziału linii '\'.


    Czyli wynikało by z tego, że .define to jednolinijkowe .macro.

    Niestety, wywołanie zdefiniowanego bytu poprzez .define wymaga nawiasów, a .macro nie wymaga, natomiast przekazuje je dalej tekstowo (co jest w porządku)

    Czyli nie można ich zamiennie stosować, to inne dyrektywy.