atarionline.pl Mads - dyrektywa #IF - 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:
       
      CommentAuthorxeen
    • CommentTime25 Apr 2013 zmieniony
     
    wydaje mi się, że dyrektywa #IF nie zawsze dobrze rozpoznaje zagnieżdzenia. W przypadku konstrukcji

    #IF
    kod
    #END
    #IF
    kod
    #END
    #IF
    kod
    #END
    #IF
    kod
    #END

    miałem problem, dopiero wstawienie spacji między #END i #IF pomogło. Straciłem masę czasu na diagnozie czemu coś nie działa - to wklejam - ale na razie na zasadzie podejrzeń, może ktoś kiedyś tez się zatnie.

    Zastanawiam się, jak bardzo "nie opłaca" się używać tej dyrektywy kosztem pure asma - ile się traci na wydajności, bo przejrzystość jest ogromna.
    • 2: CommentAuthortebe
    • CommentTime25 Apr 2013
     
    nie spotkałem się z czymś takim jeszcze, jakby co to jest jeszcze #ELSE

    a kod jaki generuje zawsze możesz podejrzeć
    • 3: CommentAuthorcalypso2k
    • CommentTime25 Apr 2013
     
    @xeen a mógłbyś, jeśli to nie tajemnica, wkleić rzeczony kawałek kodu? Albo taki, który cierpi na tą przypadłość.

    Wygląda, żę #END łyka kolejnego #IF w jakimś skrajnym przypadku, ale nijak to się ma do źródła mads'a...
    • 4:
       
      CommentAuthorxeen
    • CommentTime25 Apr 2013
     
    tak, postaram się zapodać wieczorem :)
    • 5:
       
      CommentAuthorxeen
    • CommentTime25 Apr 2013 zmieniony
     
    bzdurę napisałem. przepraszam
    nie ma tematu - to wynik nocy i półprzytomności.
    • 6: CommentAuthorcalypso2k
    • CommentTime25 Apr 2013
     
    patrząc po kodzie mads'a, tak przypuszczałem :P
    ale miałem w życiu już do czynienia z takimi warunkami granicznymi, że nie będę nikomu podważał, że mu nie działa :)
    • 7:
       
      CommentAuthormgr_inz_rafal
    • CommentTime26 Nov 2014 zmieniony
     
    Podepnę się pod wątek, żeby nie zaczynać nowego.

    Kompiluję taki oto kawałek kodu:
    .proc is_on_map_3030(.word part2) .var
    ldx #0
    #if .word part2 = game_state.current_map+2 .and .word game_state.current_map = #$3030
    inx
    #end
    rts
    .endp


    I jako output dostaję:
    :?J/2-1 ORA#0
    immovabl.asm (352) ERROR: Value out of range
    Writing listing file...
    Linia 352 to linia z #if-em

    Czy ten komunikat błędu może mnie jakoś nakierować na przyczynę problemu? Podobne konstrukcje z powodzeniem kompilują się w innych miejscach.

    Wersja: mads 1.9.8 build 46 (11 Jan 14)

    ------ EDYTA ------
    Wychodzi na to, że zarówno "lewa" jak i "prawa" strona .and osobno kompilują się poprawnie. Może jakiś specyficzny problem z wyrażeniem logicznym?

    Dodam też, że 5 linijek niżej jest prawie identyczny #if i ten kompiluje się nawet z .and

    :/
    • 8: CommentAuthorwieczor
    • CommentTime26 Nov 2014
     
    A jak wygląda deklaracja game_state.current_map ?
    • 9:
       
      CommentAuthormgr_inz_rafal
    • CommentTime26 Nov 2014 zmieniony
     
    .STRUCT game
    current_map .dword
    .ENDS

    .var game_state game


    PS. W międzyczasie namierzyłem też inne, problematyczne #if-y, które nie operują na "game_state".
    • 10: CommentAuthorwieczor
    • CommentTime26 Nov 2014
     
    Ale moment może się nie znam, ale tu masz double word a w ifie word? To chyba o to chodzi
    • 11:
       
      CommentAuthormgr_inz_rafal
    • CommentTime26 Nov 2014 zmieniony
     
    Nie, to akurat jest OK (if-uję osobno dwie części dworda).

    Muszę chyba spróbować metodą eliminacji "czegoś wcześniej" w kodzie - projekt jest już dość duży.

    Albo przepiszę te #ify na normalny, ludzki ASM :)
    • 12: CommentAuthorwieczor
    • CommentTime26 Nov 2014 zmieniony
     
    Zrobiłem na próbę wersję minimalistyczną:

    org $2000
    .def part2

    .STRUCT game
    current_map .dword
    .ENDS

    .var game_state game

    .proc is_on_map_3030(.word part2) .var
    ldx #0
    #if .word part2 = game_state.current_map+2 .and .word game_state.current_map = #$3030
    inx
    #end
    rts
    .endp


    i nic nie krzyczy, więc Ci kłamie że to tutaj :)

    Edit: ej, ale w wygenerowanym kodzie nie ma żadnego ORA... Więc coś tu jest nie tak
  1.  
    Tak, wersja minimalistyczna działa. Bliźniaczy #if utworzony parę linijek niżej przez copy&paste, gdzie #$3030 zamieniłem na #$3031 też działa.

    Mnóstwo takich ifów w innych miejscach kompiluje się poprawnie i ten fakt, w połączeniu z dziwnym komunikatem błędu (":?J/2-1 ORA#0") sugeruje, że to MADS się lekko pogubił.
    • 14: CommentAuthorwieczor
    • CommentTime26 Nov 2014
     
    A w out of range nie chodzi czasem o miejsce w pamięci itp? Taki komunikat dostajesz np przy uzyciu .zpvar i przekroczeniu granicy strony 0.
    • 15:
       
      CommentAuthormgr_inz_rafal
    • CommentTime26 Nov 2014 zmieniony
     
    Dobra, sytuacja wstępnie wyjaśniona.

    Mały background: instalowałem parę dni temu system od nowa i przy okazji porządkowałem też środowisko pracy "do Atari". W swojej naiwności stworzyłem od nowa skrypt do kompilacji i odruchowo dodałem w nim przełącznik "-x" do MADS [Exclude unreferenced procedures].

    Myślę sobie... K*.*a, na drugim kompie przecież TEN SAM kod kompiluje mi się TYM SAMYM kompilatorem :/ Zacząłem porównywać detale i rzeczywiście jedyną różnicą był ten pieprzony "-x" :/

    W tym momencie przypomniało mi się, że już ten problem miałem jakiś mniej więcej rok temu gdy wprowadzałem do Rzygonia coś a'la DLL :)

    No i istotnie procedurka is_on_map_3030() nie jest wywoływana w żadnym miejscu projektu, ale odwołanie do niej jest zawarte dopiero w doładowywanej binarce.

    Zatem, "-x" jest wielce niepożądany, gdyż kod zawarty w procedurze musi zostać skompilowany, bo mimo braku bezpośrednich odwołań, 6502 prędzej czy później tam wskoczy.

    Wnioskuję więc, że MADS może mieć jakiś problem w rozwijaniu pseudorozkazów jak np. #if wewnątrz procedur, które ostatecznie są usuwane. Skutkuje to właśnie takim dziwnym, nic nie mówiącym komunikatem błędu.

    Autor MADSa chyba tu bywa, więc może rzuci przy okazji trochę światła.

    A ja wracam do zabawy :)
    Writing listing file...
    Writing object file...
    7582 lines of source assembled in 8 pass
    15956 bytes written to the object file
    • 16:
       
      CommentAuthormgr_inz_rafal
    • CommentTime26 Nov 2014 zmieniony
     
    Tak, wydaje mi się, że potwierdziłem problem w MADS. Wziąłem, wieczor, Twoją wersję minimalistyczną i dopisałem na końcu "lda", żeby coś tam się jednak kompilowało:
    org $2000
    .def part2

    .STRUCT game
    current_map .dword
    .ENDS

    .var game_state game

    .proc is_on_map_3030(.word part2) .var
    ldx #0
    #if .word part2 = game_state.current_map+2 .and .word game_state.current_map = #$3030
    inx
    #end
    rts
    .endp

    lda #0


    I teraz kompilacja bez opcji "-x":
    c:\>mads.exe -l:test.lst -o:test.xex test.asm
    Writing listing file...
    Writing object file...
    23 lines of source assembled in 4 pass
    67 bytes written to the object file


    Oraz z "-x":
    c:\>mads.exe -x -l:test.lst -o:test.xex test.asm
    :?J/2-1 ORA#0
    test.asm (12) ERROR: Value out of range
    Writing listing file...
    • 17: CommentAuthorwieczor
    • CommentTime27 Nov 2014
     
    O widzisz, dobrze wiedzieć, dzięki za info.