atarionline.pl Rzeczy które chciałbyś w MADSie ale boisz się poprosić :) - 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.  
      After upgrading to the latest MADS yesterday to investigate the RELOC changes I still don't understand, I discovered the new build will no longer compile the SIDE3 loader. I get a 'Label name required' error here, which is a specious error since the code is OK and has compiled will all prior versions of MADS. Fortunately I kept the prior MADS executable, renamed 'MADS_OLD.EXE'. ;)
      • 2: CommentAuthortebe
      • CommentTime24 Feb 2022 21:02
       
      '@' as label? be more creativity

      char '@' is anonymous labels, used for branch

      ->link<-
      • 3:
         
        CommentAuthorpirx
      • CommentTime24 Feb 2022 23:02 zmieniony
       
      oh boy, this code looks like C++ or some other high level shite a bit :))))
      • 4: CommentAuthormono
      • CommentTime25 Feb 2022 01:02
       
      Mads is for people who are too lazy to learn assembler :P
      • 5:
         
        CommentAuthorsun
      • CommentTime25 Feb 2022 09:02
       
      @mono: you can also write programs in notepad right away in hex ;)
      +1000 to exp ;)
      • 6:
         
        CommentAuthorshanti77
      • CommentTime25 Feb 2022 10:02
       
      @sun

      MADS
      mva:rpl	(src),y	dest,y-


      Assembler
      loop
      lda (src),y
      sta dest,y
      dey
      bpl loop
    2.  
      '@' as label? be more creativity

      char '@' is anonymous labels, used for branch


      What's wrong with '@'? Sometimes no label is needed at all, but since dta requires it, it's convenient to use '@' since I may not reference the label anyway. I have other things to do than be 'creative' with a label I won't even reference. :)

      Question is: why did this behaviour suddenly change? Am I expected to go back and change a decade's worth of source code? I have been using MADS for rather a long time, don't forget.

      Regarding the prior 'RELOC' question, as well: the terse explanations of new features are completely puzzling to me, so currently there's little reason to update the compiler anyway.
    3.  
      oh boy, this code looks like C ++ or some other high level shite a bit :))))


      STRUCTs are actually surprisingly useful even as an aid to readability, especially if you have a huge array of data which would otherwise resemble an enormous table of meaningless labels and numbers. More importantly, they're also an aid to maintainability... until they break.

      I tried - in the older MADS build - to simply remove the '@' labels entirely, since there are already PROC identifiers right in front of the DTA statements anyway. Interestingly, this works sometimes and other times results in an error:
      • 9:
         
        CommentAuthorsun
      • CommentTime25 Feb 2022 14:02
       
      @shanti77: ależ ja się wychowałem na QA więc jakby rozumiem o co biega :)
    4.  
      A jest może w MADS taki feature, że mogę "oznaczyć" jakąś pamięć jako data i żeby jej naruszenie powodowało błąd kompilacji?

      Np. oznaczam $3000-$3fff jako dane i zaczynam pisać kod od $2000. Piszę piszę i nagle mój kod "wchodzi" w $3001 i dostaję error.
      • 11:
         
        CommentAuthorjhusak
      • CommentTime26 Feb 2022 09:02 zmieniony
       
      Spróbuj
      .if *>=$3000
      .error „złe”
      .endif
      org $3000
      … dane


      Piszę z pamięci, ale jakoś tak.
      • 12: CommentAuthorilmenit
      • CommentTime26 Feb 2022 10:02
       
      @mgr_inz_rafal - najwygodniej wykorzystac segmenty:
      ->link<-
      definiujesz ich rozmiar i adres i MADS pilnuje tego, aby dane czy kod nie przekraczały zdefiniowanych zakresów. Bardzo wygodne.
    5.  
      O to to!
      Dzięki Panowie ;)

      Sporo krwi mi napsuło takie niespodziewane nadpisanie czegoś w pamięci.
      • 14:
         
        CommentAuthorjhusak
      • CommentTime27 Feb 2022 21:02
       
      Zwłaszcza, że mads prowokuje do używania .rept a wówczas dane puchną, oj puchną :)
      • 15:
         
        CommentAuthorjhusak
      • CommentTime21 Sep 2022 08:09
       
      Ponieważ ostatnio między innymi rozwijam kod movplay, przydała by mi się taka instrukcja, co liczy cykle w jakiś sposób - ręczne tego robienie jest dość żmudne.

      A ponieważ jeszcze będę tego potrzebował - to piszę :)

      KK w swoim k65 zrobił coś na kształt okienka czasowego, które deklaruje, a k65 wrzuca tam kod.

      Problem z semantyką i ze skokami, można obliczać wszystkie kombinacje i liczyć najdłuższą sekwencję i wywalać warning lub błąd, jeśli takie coś się napotka.
      • 16: CommentAuthortebe
      • CommentTime21 Sep 2022 09:09
       
      podaj przykład z k65 takiej instrukcji, nie spotkałem się z czymś takim
      • 17:
         
        CommentAuthorCOR/ira4
      • CommentTime21 Sep 2022 10:09
       
      brakuje zakładki z wersją programowania wizualnego/obiektowego, bym nie musiał tyle siedzieć, ułatwiłoby mi to w znaczący sposób prace(coś tam koduje sobie ). ;) ;) ;)
      • 18: CommentAuthortebe
      • CommentTime21 Sep 2022 10:09
       
      do liczenia cykli używam osobnego narzędzia, które jest niekompletne, bo nie zawiera wszystkich instrukcji 6502, dla mnie jak na razie starczało

      jako parametr podaje się plik XEX, bez bloków INI, tylko blok RUN, symulacja startuje od adresu RUN, kończy się po napotkaniu rozkazu BRK
      • 19:
         
        CommentAuthorjhusak
      • CommentTime21 Sep 2022 11:09 zmieniony
       
      Zostałem poprawiony, że rzeczywiście nie ma czegoś takiego. Jednakże kiedyś rozmawiałem z KK i on się chwalił, że ma takie coś w K65 - używa tego aby wpleść się z obliczeniami w obraz generowany na A2600. Może źle zrozumiałem, ale idea była tego typu.

      Dzięki za ten profiler, wrzuć go na gh, to Ci ludzie może pomogą z tymi rozkazami :)
      • 20:
         
        CommentAuthorpirx
      • CommentTime14 Nov 2022 05:11 zmieniony
       
      ciekawy problemik z opcją OPT r+

      kod:
      mva #4 ResultY
      @
      mwa #lineClear LineAddress4x4
      jsr _sep_opty
      dec di
      bne @-


      to zostaje skompilowane do

      lda #4
      sta resulty
      @
      sta LineAddress4x4
      ...


      co by prawie działało, gdyby nie to, że pętla skacze do `sta`.
      Chyba optymalizacja nie powinna działać na skraju etykiet...
      • 21: CommentAuthorilmenit
      • CommentTime14 Nov 2022 07:11
       
      Odnośnie liczenia cykli i profilowania kodu, @jhusak zerknij na profiler w Altirra. Może on będzie OK? Ja używałem przy pisaniu Adam Is Me do wybierania funkcji do optymalizacji i potem testowania, czy optymalizacje przynoszą efekt.
      • 22:
         
        CommentAuthorjhusak
      • CommentTime15 Nov 2022 12:11 zmieniony
       
      Jeszcze czego mi często brakuje, to składni takiej, aby instrukcje scc, sne etc skipowały więcej niż jedną (pseudo)instrukcję

      Nie działa to z makrami, ani z .local, ani w jednej linijce, np.
      lda 20
      sne
      .macro tmp
      nop
      nop
      .endm
      tmp
      rts

      sne opuści tylko pierwszy nop, co skrupulatnie wynotuje:
      test.asm (1) WARNING: Skipping only the first instruction

      Po prostu przydałyby się bloki kodu typu {}
      lda 20
      sne
      {
      inc 30
      dec 32
      }

      A może jest coś takiego, tylko nie umiem szukać?
      Wiem, że są małpki, ale one wprowadzają więcej zamieszania i generują dużo błędów, w efekcie jednak stosuję jakieś tam labelki nazwane.

      Jest też składnia #if, ale ona jest przegadana i nie można napisać:
      #if C=0
      carry is cleared
      #end

      Można użyć tylko akumulatora
      #if .byte @
      #end
      albo
      #if .byte @=#1
      #end
      • 23:
         
        CommentAuthorjhusak
      • CommentTime16 Nov 2022 23:11
       
      To chyba błąd:

      opt h-
      org $2000
      rts
      .align $10
      rts

      generuje pliczek złożony z 2xRTS

      opt h-
      org $2000
      rts
      .align $10,$ff
      rts

      generuje poprawnie - rts, potem 15 bajtów ff, a potem rts.

      Piszę chyba, bo nie wiem, jak dokładnie działa opcja h- - czy ona usuwa headery i już, czy jakoś inaczej.

      Zauważyłem, że opcja .align xxxx,$ff jest załączana z automatu, jeśli mamy opt f+
      Czy to dlatego, żeby uniknąć takich dziur?
      • 24: CommentAuthormono
      • CommentTime16 Nov 2022 23:11
       
      Nikt madsa nie przewidział do pisania kodu dla kartridży :D
      • 25:
         
        CommentAuthorjhusak
      • CommentTime17 Nov 2022 01:11 zmieniony
       
      Opcja f+ jest dla kartridży. Tylko nie wiem, czy f+ znaczy .align f+ czyli efami, czy po prostu fill gaps.
      • 26: CommentAuthormono
      • CommentTime17 Nov 2022 01:11 zmieniony
       
      Do kartridży masz teoretycznie opt f oraz b i konstrukcje .align i bankowanie rmb oraz nmb. Jeszcze chyba było .pages. Okiełznanie tego wymaga jednak sztuczek, bo nie działa to intuicyjnie i jest jak piszesz. Co ja się nakombinowałem, żeby banki były wypełniane poprawnie, bo f+ nie robi co trzeba.
      opt o+ h- ?+ c- f+ b-

      ; bank 0

      opt f-
      org $8000
      opt f+
      rmb

      nop ;treść banku

      if * > $C000
      .error *
      .elseif * < $C000
      org $BFFF
      .byte $FF
      .endif

      ; bank 1

      opt f-
      org $8000
      opt f+
      nmb

      nop ;treść banku

      if * > $C000
      .error *
      .elseif * < $C000
      org $BFFF
      .byte $FF
      .endif

      i tak w koło Macieju. Zrezygnowałem w końcu z użycia .alignów i innych cudownych konstrukcji na rzecz tego ifa.
      Oczywiście wolałbym żeby kod wyglądał tak:
      opt o+ h- ?+ c- f+ b-

      .align $4000

      rmb
      org $8000

      nop

      nmb
      org $8000

      nop

      end

      ale jak się nie da, to trudno.
      A potem jeszcze pewnie będziesz chciał się dowiedzieć jaki jest nr banku dla konkretnej etykiety (=etykieta)...
      Albo używać etykiety z któregoś banku w innym banku (:etykieta)...
      Nieeee, od takich rzeczy niech Cię ręka boska broni.

      A jak zrobić kod przepisywany z jednego miejsca w drugie tak, żeby to działało bezproblemowo, to do dzisiaj nie wiem.
      A gdybyś tak chciał dopasować kod nie do początku strony, ale do końca... Zapomnij. A splatanie dwóch procedur?

      Za dużo bym chciał :)

      Nie zmienia to faktu, że mads jest najbardziej zaawansowanym crossassemblerem jaki znam. I jedynym który generuje kod dla SDX.
      • 27:
         
        CommentAuthorjhusak
      • CommentTime15 Jan 2023 15:01 zmieniony
       
      Wow, dopiero teraz przeczytałem. To rzeczywiście mina.

      @tebe, czy jest możliwość przekazania stringu do źródła madsa? Chodzi o np. nazwę pliku, żeby nie modyfikować źródeł dla różnych plików.

      ---edit---

      Ogarnąłem w ten sposób, że dodałem plik z makrami przy pomocy opcji:
      -m:file.mac

      Przy okazji usunąłem błąd, który zjadał pierwszą literę nazwy pliku z makrami i zakomitowałem w repozytorium.
      • 28: CommentAuthortebe
      • CommentTime3 May 2023 11:05 zmieniony
       
      dobrze by było gdyby umieszczać takie uwagi w ISSUES

      ->link<-

      ostatnio zauważyłem wpis Draco na temat JSL i jego opinie że go ignoruję, chciałem wrócić do tego ale już nie pamiętam gdzie to widziałem

      trudno mi jest te wszystkie wątki pamiętać, nie jestem w stanie "od strzała" usiąść i coś poprawić, więc polecam ISSUES, tam też można z dopiskiem FEATURE umieszczać sugestie nowych dodatków

      wracając do .ALIGN i wypełnień "dziur"

      - .ALIGN $40

      spowoduje utworzenie nowego bloku (ORG)

      - .ALIGN $40, $aa

      nie spowoduje utworzenia nowego bloku (ORG) tylko wypełni wartością $AA przestrzeń aż do nowego adresu ustanowionego przez .ALIGN $40

      - jako przełącznik -fv:value (mads.exe filename.asm -fv:$aa)

      przełącznik -FV:value dotyczy opcji 'OPT F+'

      -fv:dec
      -fv:$hex

      domyślnie wartością wypełniania jest $FF

      p.s.
      dobrymi przykładami generowania cartów są przykłady dla Atari7800

      ->link<-

      assemblacja 'mads.exe filename.asm -fv:0'
      • 29: CommentAuthorilmenit
      • CommentTime4 May 2023 08:05 zmieniony
       
      z ciekawości, czemu domyślnie wartością wypełniania jest $FF a nie $00?

      Pytanie odnośnie banków w MADS. Jaki jest Wasz preferowany sposób pracy z kodami, aby w prosty sposób generować zarówno XEXa dla pamięci rozszerzonej jak i obraz dla Carta, z tych samych kodów źródłowych? Na razie (dopóki pamięć się nie skończy) w bankach chcę mieć tylko dane, bez kodu.
      Aktualnie używam segmentów, projekt mam rozbity na kilkadziesiąt małych plików kodu i danych i mam plik linkujący (include) to wszystko do kilku segmentów (strona zerowa, pamięć pod bankiem, pamięć banku, pamięć nad bankiem przed OS, pamięć pod ROM).
      • 30:
         
        CommentAuthorjhusak
      • CommentTime4 May 2023 12:05
       

      ilmenit:

      czemu domyślnie wartością wypełniania jest $FF a nie $00?

      Zapewne to, że ta opcja jest dla kartridży, a kartridże to rom, a rom to ff domyślnie. Szybciej się programuje pamięci.
      • 31: CommentAuthorilmenit
      • CommentTime4 May 2023 13:05
       
      Dzięki, nie wiedziałem, że ROM ma domyślnie $FF.
      • 32: CommentAuthormono
      • CommentTime4 May 2023 13:05
       
      EPROM kasują się (ultrafioletem) do $FF i Flash (elektrycznie) chyba też, ale EEPROM wydaje mi się, że kasują się (tez elektrycznie) na $00.
      • 33:
         
        CommentAuthorjhusak
      • CommentTime4 May 2023 14:05 zmieniony
       
      Tak czy inaczej wewnętrznie się kasują na ff. A jeśli mają 00, to znaczy, że mają logikę xor (stosowane bywa w pamięciach flash tyku karta, pendrive, etc)

      Kasowanie elektrycznie czy ultrafioletem to jeden czort. Flash ma zapis wierszami, a eeprom po jednym bajcie. We flashach często występuje tzw. protokół zapisu bajtu (czy też komenda zapisu bajtu), aby działały jako prom, a nie modyfikowały się w wyniku błędu w kodzie. W eeprom nie wiem, wiem, że miałem eeprom typu "ram" - zapisałeś bajt i był. Tyle, że trwało to rzędu milisekundy na bajt. Piszę z pamięci, mogę się mylić z tymi milisekundami, ale cały eprom 8kB można było zapisać w kilka sekund.

      Tak, jak się kupuje promki, one mają same ff-y. Dopiero zera się zapisuje programatorem przy pomocy określonych sekwencji napięć na nóżkach sterujących.
      • 34: CommentAuthormarok
      • CommentTime6 May 2023 13:05
       
      Wpakowuję się w temat z donosem na pewien szczególik (można to nazwać "od biedy" prośbą o nowy ficzer - choć niekoniecznie w tym rzecz).

      Nie ma w zasadzie problemu, ale chciałbym zwrócić uwagę na pewną specyfikę.

      Deklaruję bardzo długi obszar var na stronie zerowej, dlatego robię to poprzez deklarację kolejnych zmiennych w nowych fizycznie liniach za pomocą użycia znaku "\".

      Gdybym jednak chciał dodatkowo zachować sobie w komentarzach w deklaracji te zmienne, które nie są mi na tą chwilę potrzebne, to raczej mogą pojawić się z tym mniej oczekiwane trudności.

      W moim odczuciu pierwsza forma też mogłaby (czy powinna?) działać, ale nie działa. Druga forma działa - dlatego nie ma żadnego problemu (może tylko warto sobie tą drobną zależność odnotować).

      .zpvar \

      @DCP    \
      /*;@DCPA \*/
      @DEC \

      (spacja między "\" a "*/" nie pomoże)

      @DCP    \
      /*;@DCPA \
      */
      @DEC \
      • 35:
         
        CommentAuthorCOR/ira4
      • CommentTime7 May 2023 20:05
       
      funkcje automatycznego pisania gier, taki "Thermomix "growy, wrzucamy grafiki, animacje, muzyczki, dokładnie opisujemy co gdzie i jak, opisujemy zasady gry, do tego mamy wpływ na różne szczegóły,
      a kod pisze się sam :D.
      • 36:
         
        CommentAuthorpirx
      • CommentTime24 May 2023 19:05
       
      chyba nie ma w madsie opcji ustawienia ostatniego znaku napisu w inwersie.

      a może dałoby się skrobnąć jakieś makro, coś w rodzaju

      .macro dtinv text
      dta d text[:-1]
      dta d text[-1]*
      .endm

      (oczywiście to taki pseudokod, ale może coś takiego dałoby się magią Madsa uzyskać?)
      • 37: CommentAuthormono
      • CommentTime24 May 2023 22:05
       
      .cb 'coś'
      • 38:
         
        CommentAuthorPecus
      • CommentTime24 May 2023 22:05 zmieniony
       
      Mnie trochę ten dualizm pewnych dyrektyw/rozkazów madsa wkurza :)

      dla "dta" nie ma takiej możliwości a dla .by jest opcja .cb ale nie działa dla INERNALi :) (edytowałem post po tym co pirx napisał)

      Chciałbym móc napisać kod korzystając z jednej z tych konwencji, a nie nagle zorientować się, ze muszę użyć na chwilę drugiej. Źródła byłyby bardziej czytelne.
      • 39:
         
        CommentAuthorpirx
      • CommentTime24 May 2023 23:05
       
      nie ma co narzekać, dobrze, że jest. i pewnie da się screencodes wstawić w odp. cudzysłowach
      • 40:
         
        CommentAuthorpirx
      • CommentTime25 May 2023 04:05
       
      No niestety to działa wyłącznie dla kodów ATASCII, nie działa dla INTERNAL :(
      No to może jakiś patencior z makro?
      • 41:
         
        CommentAuthorPecus
      • CommentTime25 May 2023 07:05 zmieniony
       
      A może jednak wolelibyśmy rozszerzenie dta o np. ^ na końcu (działający tak jak * ale robiacy invers tylko ostatniego znaku bez paczenia czy to ATASCII czy INTERNAL czy cokolwiek innego).

      Niech po prostu ustawia 7my bit w ostatnim bajcie dowolnego ciągu na końcu którego dodamy ten znacznik. Czyli jak * :)

      Please!
      • 42:
         
        CommentAuthorpirx
      • CommentTime25 May 2023 13:05 zmieniony
       
      a postawię tyketa, bo tak, to by się bardzo brzydało
      ->link<-
      • 43:
         
        CommentAuthorPecus
      • CommentTime3 Jun 2023 09:06
       
      tebe .... no zobacz jak musi wyglądać kod:
      ->link<-

      (np. od linii 482 :)

      że nie wspomnę o:
      ->link<-

      Weź, proszę, i dodaj to: ->link<-

      Bardzo prosimy :)
      • 44: CommentAuthortebe
      • CommentTime3 Jun 2023 11:06 zmieniony
       
      dodane ->link<-

      dta 'text'^
      dta "text"^
      • 45:
         
        CommentAuthorpirx
      • CommentTime3 Jun 2023 11:06
       
      mniut :)
      • 46:
         
        CommentAuthorPecus
      • CommentTime3 Jun 2023 11:06
       
      Dziękujemy!! w imię czytelności kodu źródłowego :)
      • 47: CommentAuthormono
      • CommentTime3 Jun 2023 13:06
       
      Ładnie działa, ale:

      1. Czemu właściwie w .cb nie można używać kodów internal z cudzysłowami?
      2. Pięknie działa *^, ale już ^* nie działa.
      • 48:
         
        CommentAuthorPecus
      • CommentTime3 Jun 2023 15:06
       
      1. nie wiem - nawet nie sprawdzałem, chciałem trzymać się jednego sposobu zapisu deklaracji danych. Zapis w postaci dta x.... wydał mi się klarowniejszy niż .BY czy .CB (choć wychowałem się na MAC65 :) ). Akurat te fragmenty kiedyś przetłumaczył ma MADSa pirx i mi się to teraz bardziej podoba :)
      Z resztą różnicowanie typu danej przy pomocy zmiany ' na " ... oj ... mało czytelne jak dla mnie :)

      2. Dajesz!
      • 49: CommentAuthormono
      • CommentTime3 Jun 2023 16:06
       
      Proszę bardzo :)
      Mój wkład w rozwój madsa polega na zgłaszaniu problemów i propozycjach zmian i usprawnień. Implementację zostawiam lepszym od siebie :)
      • 50:
         
        CommentAuthorpirx
      • CommentTime3 Jun 2023 17:06
       
      btw z ta zmiana kod daje sie czytac :) jest dobrze a bedzie jeszcze dobrzej jak opt r+ da sie poprawic...