atarionline.pl [MADS] - problemy - 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: CommentAuthormuffy
      • CommentTime18 Aug 2013 01:08
       
      Ponieważ człek lubi sobie utrudniać życie, to od 2 dni męczę MADSa i pojawił się problem.

      Z przykładów (examples) bez problemu kompilują się większość plików .asm lecz niektóre (te korzystające z bibliotek jak np. stdio) wywalają błąd nr 3.
      Domyślam się, że źródło problemu leży w składni jak tu
      ".link 'libraries/stdio/lib/printf.obx'" (detect_cpu.asm)
      a i z nieznanych mi przyczyn czasem jest stosowany inny zapis:
      ".link 'lib\posxy.obx'" (example.asm z stdio właśnie)

      I problem 2 typu jak w PSPpad zrealizować kompilecję pliku? Podpiąłem ścieżkę (i odpowiednią bibliotekę z kompilatora) ale z przekazaniem parametru (tj. nazwy pliku do kompilacji mam kłopot.

      Ktoś może mi to łopatologicznie wytłumaczyć?
      Z góry dzięki
      • 2: CommentAuthortebe
      • CommentTime18 Aug 2013 14:08
       
      Windows toleruje oba znaki '/' i '\', w przypadku innych OS-ów MADS sam dokonuje odpowiedniej zamiany

      błąd 3, to chyba wartość jaką zwraca MADS po zakończeniu działania, sugeruję użyć konsoli wtedy zostaną wyświetlone bardziej sensowne komunikaty

      mads plik.asm
      • 3: CommentAuthormuffy
      • CommentTime18 Aug 2013 15:08
       
      Z wiersza poleceń wszystko działa jak należy inna sprawa że po to chciałem mieć kompilację z edytora by było "łatwiej" i z podświetleniem składni etc. ;)

      Pytania.
      1. czy to przez moje dłubanie czy tak jest już zapisane? Mianowicie w pliku porazka.asm w przykładowych plikach jest bug z adresowaniem TYA. (ale może to ja coś kombinując nadpisałem).
      2. czy OPT jest w 100% kompatybilny z QA (w stronę MADSa oczywiście)?
      Dzięki
      • 4: CommentAuthortebe
      • CommentTime18 Aug 2013 16:08
       
      opt z QA nie jest kompatybilne z MADS

      poprawka dla Porazka.asm

      tya 	;#0
      • 5: CommentAuthormuffy
      • CommentTime2 Sep 2013 19:09
       
      jaka jest prawidłowa składnia dla pseudorozkazu INS?
      Coś chyba źle kombinuję.
      Czy dla danego zbioru, który kończy się sekwencją np. 7,8,9
      użycie INS 'dane.bin' -OFSET,3
      spowoduje odczytanie 3 bajtów w kolejności 9,8,7 czy 7,8,9?
      I jak użyć składni by wczytać np pierwsze 120 bajtów pliku zamiast całości?
      • 6: CommentAuthortebe
      • CommentTime2 Sep 2013 22:09
       
      opis jest w instrukcji


      INS 'filename'["filename"][*][+-value][,+-ofset[,length]]

      Pseudo rozkaz INS pozwala na dołączenie dodatkowego pliku binarnego. Dołączany plik nie musi znajdować się w tym samym katalogu co główny asemblowany plik. Wystarczy, że odpowiednio wskazaliśmy MADS-owi ścieżki poszukiwań za pomocą przełącznika /i (patrz Przełączniki assemblera).
      Dodatkowo można przeprowadzić na dołączanym pliku binarnym operacje:

      * invers bajtów pliku binarnego
      +-VALUE zwiększenie/zmniejszenie wartości bajtów pliku binarnego o wartość wyrażenia VALUE

      +OFSET ominięcie OFSET bajtów z początku pliku binarnego (SEEK OFSET)
      -OFSET odczyt pliku binarnego od jego końca (SEEK FileLength-OFSET)

      LENGTH odczyt LENGTH bajtów pliku binarnego

      Jeśli wartość LENGTH nie została określona, domyślnie plik binarny zostanie odczytany aż do końca.


      wczytanie pierwszych 120 bajtów

      ins 'filename,0,120
      • 7: CommentAuthormuffy
      • CommentTime2 Sep 2013 22:09
       
      Instrukcję to mam cały czas przed nosem ale do mnie to trzeba drukowanymi i 2 razy a najlepiej przykładami a tych mi brakowało do tego rozkazu. Dzięki. (zjadło znaczek apostrofu chyba przy nazwie pliku)
      A z innej beczki jak zakodować w ten sposób wczytanie pliku o długości Lenght-X , gdzie X to ilość bajtów a Lenght jest nieznane? (tzn znane jak sobie zobaczymy pod dosem ale nie patrząc na kod)
      • 8: CommentAuthortebe
      • CommentTime3 Sep 2013 11:09
       
      length można poznać

      .print .filesize 'filename'

      ins 'filename',.filesize(filename)-bytes
      • 9: CommentAuthormarok
      • CommentTime3 Sep 2013 15:09
       
      Ciesze sie ze ostatnie pytanie padlo i ze jest na nie taka odpowiedz (miewalem podobne zapotrzebowanie).

      Tylko takie szybkie pytanie (zanim sam to sprawdze), czy we wzorcu do odpowiedzi nie powinno byc:

      ins 'filename',0,.filesize(filename)-bytes
      • 10: CommentAuthormarok
      • CommentTime3 Sep 2013 15:09
       
      Sprawdzilem i dziala. Dzieki TeBe i muffy.
      Wzorzec wymaga jeszcze drobnej poprawki i powinien wygladac nastepujaco:
      ins 'filename',0,.filesize('filename')-bytes
      • 11: CommentAuthormuffy
      • CommentTime3 Sep 2013 20:09
       
      Również dziękuję.
      Tak sobie myślę że przydałby się taki tutorial jak "ABC MADS'a" w stylu "Poradnika Programisy Atari" :)
      Tylko kto by go napisał ?
      • 12:
         
        CommentAuthorjhusak
      • CommentTime3 Sep 2013 20:09 zmieniony
       
      Znalazłem błąd:

      org $2000
      clc
      scc:adw $1ff0 #10
      rts

      Otóż po skompilowaniu:

      2000 18          CLC
      2001 90 0b BCC $200e
      2003 18 CLC
      2004 ad f0 1f LDA $1ff0
      2007 69 0a ADC #$0a
      2009 8d f0 1f STA $1ff0
      200c 90 03 BCC $2011
      200e ee f1 1f INC $1ff1
      2011 60 RTS


      Jak widać skok jest do INC, a nie do RTS.
      Zabrało mi to troszkę czasu :)

      -- edit --

      Błąd występuje przy dowolnym sxx, który testowałem :)

      -- edit2 --

      Wygląda na to, że rxx też skacze tylko do drugiego członu:

      org $2000
      clc
      adw $1ff0 #10
      rcc
      rts


      2000 18          CLC
      2001 18 CLC
      2002 ad f0 1f LDA $1ff0
      2005 69 0a ADC #$0a
      2007 8d f0 1f STA $1ff0
      200a 90 03 BCC $200f
      200c ee f1 1f INC $1ff1
      200f 90 fb BCC $200c
      2011 60 RTS


      Czyli pewnie błąd jest gdzieś w kodzie typu adw/sbw z dwoma parametrami, bo już z trzema działa poprawnie.
      org $2000
      clc
      scc:adw $1ff0 #10 $1ff0
      rts

      2000 18          CLC
      2001 90 11 BCC $2014
      2003 18 CLC
      2004 ad f0 1f LDA $1ff0
      2007 69 0a ADC #$0a
      2009 8d f0 1f STA $1ff0
      200c ad f1 1f LDA $1ff1
      200f 69 00 ADC #$00
      2011 8d f1 1f STA $1ff1
      2014 60 RTS


      I jeszcze tebe, czy możesz usunąć wszystkie pojedyncze apostrofy z komentarzy? (mads'a ->madsa albo mads''a) :) Vim mi głupieje:)

      --edit3--
      Wygląda na to, że przeniesienie
      --- 5804,5823 ----
      zm:='SCC';

      hlp:=asm_mnemo(zm,old);
      addResult(hlp, Result);

      ! {test_skipa;
      ! }
      if mnemo[1]='S' then
      zm:='DEC ' + tmp + '+1'
      else
      zm:='INC ' + tmp + '+1';

      hlp:=asm_mnemo(zm,old);
      + test_skipa;
      +
      addResult(hlp, Result);

      end else begin

      if opty then begin


      załatwia sprawę, aczkolwiek nie testowałem zbytnio.
      • 13: CommentAuthortebe
      • CommentTime4 Sep 2013 07:09
       
      dzięki, postaram się to załatać
    1.  

      muffy:

      Tak sobie myślę że przydałby się taki tutorial jak "ABC MADS'a" w stylu "Poradnika Programisy Atari" :)
      Tylko kto by go napisał ?
      Spisuj to, czego właśnie się dowiadujesz, za parę miesięcy będzie fajny poradnik :)
    2.  
      To ja też zgłoszę pewien problem.

      Już któryś raz jestem zmuszony zastępować etykiety anonimowe nazwanymi. Np. właśnie przed chwilą :)

      Mam taki kod:
      .proc process_logic
      is_on_map #$3030 #$3330
      cpx #1
      bne @+
      process_logic_M0003
      rts
      @ write_action_name #A_CLEAR
      rts
      .endp
      Dostaję error "Branch out of range by $10BC bytes".

      W pierwszym odruchu zamieniam "bne" na "jne", ale... no właśnie - coś za daleko ten out of range (jakieś 4 kb).

      Po zmianie @ np. na "dupa", wszystko działa dobrze.

      W sumie czas zapytać, czy to ja coś robię źle, czy też nie, bo już trochę się boję używać tych mega-wygodnych etykiet anonimowych.
    3.  
      Kolejny przykład:
      .proc synchro
      lda COLPM2
      cmp #1
      bne synchr1
      ; PAL
      lda #$90
      jmp synchr2
      synchr1 ; NTSC
      lda #$7c
      synchr2 cmp VCOUNT
      bne synchr2
      rts
      .endp

      .proc delay
      ldy #30
      @ synchro
      dey
      cpy #0
      bne @-
      rts
      .endp


      Error: Branch out of range by $4284 bytes
      Error: Undeclared label 61@ (BANK=0)
      • 17: CommentAuthorxxl
      • CommentTime5 Sep 2013 11:09
       
      cpy #0 - mozesz z tego zrezygnowac, znacznik Z bedzie ustawiony po DEY jesli Y=0

      sprawa druga to etykietki tymczasowe @ - daj ja w osobnej linii i sprawdz czy zadziala
      • 18: CommentAuthordan
      • CommentTime5 Sep 2013 12:09
       
      mgr_inz_rafal - wstawiłem do swojego projektu i bez problemu się kompiluje. Czy oby na pewno masz najnowszą wersję MADSa? bo takie komunikaty o etykietach @ miałem, jak nie zauważyłem i kompilowałem na poprzedniej wersji.


      Compiler 'MADS' output:

      Writing listing file...
      Writing object file...
      803 lines of source assembled in 3 pass
      3741 bytes written to the object file

      Running 'Altirra': D:\Atari\Altirra\Altirra64.exe /singleinstance D:\Atari\workspace\AtariTest1\Start.xex
      Application returned with exit code 0.
    4.  
      @dan
      U mnie też to w osobnym pliku działa. Mam wrażenie, że to trochę zależy od tego, co jest w okolicy takiego kodu. Często zdarzało mi się, że jeśli dawałem @ po "mwa" to nie działało, a zmiana "mwa" na "lda/sta/lda/sta" rozwiązywała problem.

      MADSa mam starego (1.9.5) - musiałem przeoczyć ostatni update :/

      @xxl
      Przesunięcie @ do osobnej linijki pomaga :) Zaraz sprawdzę, czy w nowym MADS też trzeba robić taki trik.

      ----- EDIT
      OK, nowy MADS ładnie łyka te etykietki. Nie ma tematu :)

      No ale zawsze się można czegoś nowego przy okazji dowiedzieć, np. braku konieczności stosowania cpy #0 w powyższym przypadku.
      • 20:
         
        CommentAuthorjhusak
      • CommentTime5 Sep 2013 15:09
       
      Instrukcje 6502 zmieniają znaczniki.
      Znaczniki to stan procesora.
      możemy zrobić więc:
      lda #0
      jmp xxx

      xxx: bne yyy

      bo jmp nie zmienia znaczników

      albo:
      ldx #1
      lda #0
      stx gdzies
      beq xxy

      skok się wykona, bo stx nie modyfikuje żadnych znaczników.
      • 21:
         
        CommentAuthorjhusak
      • CommentTime26 Nov 2013 01:11 zmieniony
       
      @tebe.

      Sporo się naszukałem, a powód prozaiczny - zmieniłeś znaczenie
      "dta g"
      z wersji gdzieś 1.9.5 na 1.9.6, w zmianach owszem zapisałeś, ale jako "nowy ficzer", a nie "zmiana starego na nowy, zaktualizujcie źródła, teraz odpowiednikiem 'dta g' jest 'dta r'" :)

      I mię się amaurote graficznie i dosłownie krzaczył :)
      Doszedłem do tego, bo kod był zbyt krótki i po analizie żródeł madsa.

      Czy mógłbyś to dopisać do changeloga? Może inni też używają składni dta g(%10101010101010101010101010101010)

      i się dziwią :)

      Wygodnie się definiuje sprajty w ten sposób :)
      • 22:
         
        CommentAuthorjhusak
      • CommentTime27 Nov 2013 23:11
       
      2 pomyłki w instrukcji mads 1.9.7
      <30 -> tryb adresacji '#' argument 0 (obliczona wartość wyrażenia "<30")

      W/w przykład zapisuje adres etykiety pod warunkiem że taka etykiety istnieje (została zdefiniowana).


      Wartość <30 to #30
      • 23: CommentAuthorgreblus
      • CommentTime30 Nov 2013 20:11 zmieniony
       
      Hej.

      A co się zmieniło między 1.9.6 a 1.9.7, że to nie działa:
      .array ndl 3 .byte
      1, 2, 3
      .enda


      mads zwraca "ERROR: Extra characters on line"?
      • 24: CommentAuthormuffy
      • CommentTime30 Nov 2013 22:11
       
      To sprawdź na początek czy edytor nie dodał niewidzialnych dla człowieka znaczków do pliku źródłowego. ;)
      • 25: CommentAuthorgreblus
      • CommentTime30 Nov 2013 22:11
       
      Sprawdziłem. Vim pokazuje wszelkie dziwne znaczki i nic nie ma. W 1.9.6 nie ma problemu. Pod Windows to samo.
      • 26: CommentAuthormuffy
      • CommentTime30 Nov 2013 23:11 zmieniony
       
      qrka mam 1.9.6 właśnie - bez problemu w 2 przebiegach

      EDIT:

      Pod 1.9.7 zmień na
      .array ndl [3] .byte 
      1, 2, 3
      .enda


      UPDATE:
      v1.9.6 = 4 bajty
      v1.9.7 = 3 bajty
      • 27: CommentAuthorgreblus
      • CommentTime30 Nov 2013 23:11
       
      muffy, thnks! Działa zarówno w 1.9.6 jak i 1.9.7 :)
      • 28: CommentAuthormuffy
      • CommentTime30 Nov 2013 23:11
       
      No problemo - ale jest różnica w sposobie generowania kodu i jak trzeba będzie np skakać po tablicy wzglęnie (bez użycia tablicy tylko np x+4) to się możemy...
      A skoro mads już odpalony to jeszcze DISasm i coś na warsztat ;)
      • 29: CommentAuthorgreblus
      • CommentTime1 Dec 2013 00:12
       
      Na warsztat ostatnio mało czasu, chwilowo trenuje mapy atrybutów i detekcję kolizji vbxe w Action! ale mads jest super i nie boję się go już tak jak kiedyś. I to dzięki cierpliwości i pomocy ludzi z tego forum :)
      • 30:
         
        CommentAuthorxeen
      • CommentTime23 Mar 2015 22:03
       
      Wątek nazywa się problemy, a ja nie mam problemu (czy masz jakiś problem? jak pytają codziennie panowie w sportowym ubraniu przed monopolowym) tylko pytanie. W każdym razie się podpinam.
      Ku mojemu zaskoczeniu związanemu z odkyrciem kolejnej ameryki zobaczyłem dzisiaj konstrukcje rodzaju lda #{nop}

      co ucieszyło mnie niezmiernie gdyż do tej pory bardzo pracowicie i zupełnie niepotrzebnie przepisywałem sobie wartości poszczególnych mnemoników do użycia na zasadzie

      _nop equ $C8
      celem ich użycia co było bardzo fajną, niepotrzebną pracą.

      pytanie - w jaki sposób za pomocą klamr zapisać wartości mnemoników "z adresowaniem" np. wartość dla kodu instrukcji STA w STA adr,x. I czy się da....
      • 31:
         
        CommentAuthorjhusak
      • CommentTime23 Mar 2015 22:03 zmieniony
       
      Ciekawe, czy tak wyszło przypadkowo, czy taka była intencja.

      głowę dam, że
      lda # {lda # 10}

      zasembluje się do 3 bajtów... a9 a9 0a
      ---edit ---
      A jednak zasemblowało się do dwóch :D a9 a9

      Sprawdziłem jeszcze kilka innych adresowań, jest ok.
      Natomiast zagnieżdżone klamry nie działają (są ignorowane).

      Masz odpowiedź :D
      • 32:
         
        CommentAuthorxeen
      • CommentTime23 Mar 2015 23:03
       
      dzięki
      w sumie to sam mogłem se sprawdzić a nie truć :)
      • 33:
         
        CommentAuthorjhusak
      • CommentTime24 Mar 2015 18:03
       
      Może tak, ale ja nie wiedziałem o takim ficzerze i dalej bym nie wiedział. A kto wie ile jeszcze osób sobie to sprawdziło i się czegoś dowiedziało :)
      • 34: CommentAuthorxxl
      • CommentTime22 Nov 2015 11:11 zmieniony
       
      jak wymusic w MADS generowanie naglowka po napotkaniu ORG * (bez etykiety)

      chce obejsc takie konktrukcje:

      .byte $00
      org *-1
      • 35: CommentAuthormarok
      • CommentTime22 Nov 2015 14:11 zmieniony
       
      @xxl: nie do końca rozumiem dlaczego chcesz obejść podaną przez siebie konstrukcję, bo nie znam innego / łatwiejszego sposobu niż (dokładniej rozpisując) to:

      org *
      opt o-
      brk
      org *-1
      opt o+

      EDIT: poprawiłem konstrukcję, bo niepotrzebnie ją wcześniej "komplikowałem"
      • 36: CommentAuthorgorgh
      • CommentTime29 Jul 2019 15:07 zmieniony
       
      serwus, staram się wygenerować banki dla kartridża używając dyrektywy .segment, ale zamiast pliku o rozmiarze 16 kilobajtów otrzymuję plik 33 bajtowy, HALP!
      .segdef cart $8000 $4000

      .segment cart
      org $a000

      qqq
      lda 20
      sta $d01a
      cmp 20
      beq *-2
      jmp qqq

      org $b000
      rts

      org $bffa
      dta a($b000),0,%00000100,a($a000)

      .endseg


      assemblacja:
      mads cart.asm -o:cart.bin


      edit: gdy daję przełącznik
      opt f+

      to dostaję komunikat
      cart.asm (23) ERROR: Can't fill from higher ($C000) to lower memory location ($0000)
      • 37: CommentAuthortebe
      • CommentTime29 Jul 2019 17:07
       
      wystarczy f+, bez segment
      • 38: CommentAuthorgorgh
      • CommentTime29 Jul 2019 18:07
       
      A jak to assemblowac? Bo jak rozumiem pliki .bin nie maja naglowkow, to znaczy wszystkie dane leca ciurkiem
      • 39: CommentAuthorgorgh
      • CommentTime29 Jul 2019 18:07
       
      I druga sprawa- czy brak .segment nie przeszkodzi przy zapisie do kolejnych banków?
      • 40: CommentAuthortebe
      • CommentTime30 Jul 2019 12:07
       
      przykłady cartów są w katalogu mads\ATARI7800\
      • 41: CommentAuthorgorgh
      • CommentTime19 Aug 2019 20:08
       
      hej Tebe, za radą kolegi chcę zrobić obraz kartridża używając segmentów, jednak ten kod:
      opt f+h-

      .segdef cartridge $8000 $4000


      .segment cartridge


      org $a000

      qqq
      lda 20
      sta $d01a
      cmp 20
      beq *-2
      jmp qqq

      org $b000
      rts

      org $bffa
      dta a($b000),0,%00000100,a($a000)

      .endseg

      end


      kompilowany w ten sposób:
      mads cart.asm -o:cart.bin -l:cart.lst


      generuje błąd:

      org $0000
      cart.asm (24) ERROR: Can't fill from higher ($C000) to lower memory location ($0000)


      Co robię nie tak?
      • 42:
         
        CommentAuthorshanti77
      • CommentTime19 Aug 2019 22:08
       
      Kolega @tebe proponował użycie samego f+ co wygenerowało by kod bez przerw i o długości $4000. Pozbądź się .segdef .segment i .endseg.
      • 43: CommentAuthorgorgh
      • CommentTime19 Aug 2019 22:08
       
      Zgoda, jest to jakieś rozwiązanie, tylko jak w takim razie zadeklarować kolejne 16 kb kodu w tym samym miejscu...
      • 44: CommentAuthortebe
      • CommentTime19 Aug 2019 23:08 zmieniony
       
      ja to robię jako oddzielnie dołączane bloki .RELOC

      .link 'blok.obx'


      w załączniku przykład takiego bloku ładowanego do banku 16KB, 'BONUS.ASM' z gry PANG
      • 45: CommentAuthorgorgh
      • CommentTime20 Aug 2019 10:08
       
      Dzięki za odzew panowie, chyba tak zrobię
      • 46:
         
        CommentAuthorjhusak
      • CommentTime24 Jan 2021 17:01
       
      Zgłaszam błąd, mads 2.1.0

      nie działa:
      dew licznik
      bne gdzieś

      działa:
      dec licznik
      bne gdzieś
      dec licznik+1
      bne gdzieś
      • 47:
         
        CommentAuthorjhusak
      • CommentTime24 Jan 2021 23:01
       
      @Tebe, podbijam :)
      • 48: CommentAuthortebe
      • CommentTime25 Jan 2021 09:01 zmieniony
       
      cytat z instrukcji

      "Makro rozkazy DEW, DEL, DED realizują zmniejszenie odpowiednio słowa pamięci (.WORD), długiego słowa pamięci (.LONG), podwójnego słowa pamięci (.DWORD) i wykorzystują w tym celu akumulator CPU (zawartość akumulatora ulega zmianie po wykonaniu makro rozkazów DEW, DEL, DED)."
      2000: A5 80             LDA $80
      2002: D0 02 BNE $2006
      2004: C6 81 DEC $81
      2006: C6 80 DEC $80
      2008: 00 BRK
      • 49:
         
        CommentAuthorjhusak
      • CommentTime25 Jan 2021 17:01 zmieniony
       
      Dzięki za info.

      Swoją drogą mads mógłby w tym przypadku warning wyrzucać, albo tak tworzyć kod, aby był dobry (wtedy warning przed nieoptymalnym kodem). Wg mnie to jest błąd jednak mimo, że jest w instrukcji, że to źle działa by design.

      A czy zamiast LDA nie można by tu użyć BIT? Też ustawia znacznik Z.

      Instrukcja w obecnej postaci jest nieprzeszukiwalna, próbowałem tam coś konkretnego znaleźć i się poddałem. Bardzo bym prosił o dodatkowe podłączenie jej w poprzedniej postaci długiego hateemela :)
      • 50: CommentAuthortebe
      • CommentTime25 Jan 2021 18:01
       
      jhusak, twój kod jest błędny, tak nie działa DEW
      dec licznik
      bne gdzieś
      dec licznik+1
      bne gdzieś

      spróbuj w ten sposób zmniejszyć 256, dostaniesz wynik 511

      kod który generuje MADS jest najbardziej poprawny