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
     
    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
     
    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
     
    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
     
    opt z QA nie jest kompatybilne z MADS

    poprawka dla Porazka.asm

    tya 	;#0
    • 5: CommentAuthormuffy
    • CommentTime2 Sep 2013
     
    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
     
    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
     
    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
     
    length można poznać

    .print .filesize 'filename'

    ins 'filename',.filesize(filename)-bytes
    • 9: CommentAuthormarok
    • CommentTime3 Sep 2013
     
    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
     
    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
     
    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 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
     
    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
     
    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
     
    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.
    • 19:
       
      CommentAuthormgr_inz_rafal
    • CommentTime5 Sep 2013 zmieniony
     
    @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
     
    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 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
     
    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 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
     
    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
     
    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 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
     
    muffy, thnks! Działa zarówno w 1.9.6 jak i 1.9.7 :)
    • 28: CommentAuthormuffy
    • CommentTime30 Nov 2013
     
    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
     
    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
     
    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 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
     
    dzięki
    w sumie to sam mogłem se sprawdzić a nie truć :)
    • 33:
       
      CommentAuthorjhusak
    • CommentTime24 Mar 2015
     
    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 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 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 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
     
    wystarczy f+, bez segment
    • 38: CommentAuthorgorgh
    • CommentTime29 Jul 2019
     
    A jak to assemblowac? Bo jak rozumiem pliki .bin nie maja naglowkow, to znaczy wszystkie dane leca ciurkiem
    • 39: CommentAuthorgorgh
    • CommentTime29 Jul 2019
     
    I druga sprawa- czy brak .segment nie przeszkodzi przy zapisie do kolejnych banków?
    • 40: CommentAuthortebe
    • CommentTime30 Jul 2019
     
    przykłady cartów są w katalogu mads\ATARI7800\
    • 41: CommentAuthorgorgh
    • CommentTime19 Aug 2019
     
    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
     
    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
     
    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 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
     
    Dzięki za odzew panowie, chyba tak zrobię
    • 46:
       
      CommentAuthorjhusak
    • CommentTime24 Jan 2021
     
    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
     
    @Tebe, podbijam :)
    • 48: CommentAuthortebe
    • CommentTime25 Jan 2021 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 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
     
    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